在編碼學校做了一個項目,而在JS中我們使用的是Eratosthenes的篩子(我無法理解,在某種蓬勃發展的回聲中)輸出所有素數達到用戶輸入的號碼。我們與該想出的代碼是:爲什麼這個工作在JS而不是PHP?
的JavaScript代碼示例
var primeSifter = function(number) {
var numArray = numberList(number);
var prime = 2;
var count = 0;
while (prime <= number) {
numArray.forEach(function(num) {
if ((num !== prime) && (num % prime === 0)) {
numArray.splice(numArray.indexOf(num), 1);
}
});
count++;
prime = numArray[count];
}
return numArray;
}
numberList()只是創建數字爲2至任何數目的用戶輸入的數組的函數。
count++;
prime = numArray[count];
這裏的想法是要跳過尋找已經通過設置黃金等於numArray
下一個索引位置,這應該是未來最大素數刪除的數字的倍數。 這是我想弄清楚如何在PHP中實現。我可以證實這一點。在PHP然而...
PHP代碼示例
在未經修改的原始帖子,我已經使用unset
代替array_splice
。每個悲傷的傢伙的答案我開始玩他們兩個。
無論I unset
還是array_splice
,本代碼都給出了以下顯示的錯誤。
function number_list($input) {
$numList = array();
for ($i = 2; $i <= $input; $i++) {
array_push($numList, $i);
}
return $numList;
}
function sift_primes($input) {
$numArray = number_list($input);
$prime = 2;
$count = 0;
while ($prime <= $input) {
foreach ($numArray as $key => $num) {
if (($num !== $prime) && ($num % $prime === 0)) {
array_splice($numArray, $key, 1);
}
}
$count++;
$prime = $numArray[$count];
}
return $numArray;
}
這是我最初來到這裏弄清楚:如何是這兩個函數在JS和PHP根本不同?
以下是那種原始的問題的延伸:
的唯一途徑,我發現讓這個函數返回一個有效的輸出是通過更換:
$count++;
$prime = $numArray[$count];
帶:
$prime++;
但即使它給了我一個輸出,unset
和array_splice
給我不同結果。
代碼輸出Array ([0] => 2 [1] => 3 [2] => 5 [3] => 9)
,這是不正確的,因爲9顯然不是一個質數:
function sift_primes($input) {
$numArray = number_list($input);
$prime = 2;
$count = 0;
while ($prime <= $input) {
foreach ($numArray as $key => $num) {
if (($num !== $prime) && ($num % $prime === 0)) {
array_splice($numArray, $key, 1);
}
}
$prime++;
}
return $numArray;
}
與unset($numArray[$key])
回報更換array_splice
:
Array ([0] => 2 [1] => 3 [3] => 5 [5] => 7)
,正確的答案。
主要問題:
問題不在於「我如何得到我想要的輸出?」我相信我已經想出瞭如何做到這一點。我真的很想了解這兩種語言背後發生的情況,以便在JS(上面的第一個代碼塊)中生成一個無效的PHP中的有效方法(具體地說,爲什麼我不能將$prime
設置爲下一個素數拼接非素數後的數組?)。看起來他們似乎在基本層面上處理不同的拼接(顯然PHP甚至處理了unset
和array_splice
,這可能是第一個問題的延伸),這似乎是一個非常有價值的東西。
錯誤消息
這些上述
通知所涉及:未定義偏移:2 /Users/Guest/Desktop/test/sift.php上 線23
警告:在/Users/Guest/Desktop/test/sift.php上的零分在 行18
警告:司通過在/Users/Guest/Desktop/test/sift.php零上 線18
警告:司通過在/Users/Guest/Desktop/test/sift.php零上 線18
警告:司通過在/Users/Guest/Desktop/test/sift.php零上 線18
注意:未定義偏移:4 /Users/Guest/Desktop/test/sift.php上 第23行
警告:在/Users/Guest/Desktop/test/sift.php上將零除以 線18
和和和...
編輯
我繼續做了比特重新排列/格式化,試圖更好地說明問題。這主要是迴應「一個可悲的傢伙」的回覆,他在其中建議使用array_splice
而不是unset
。理由似乎是完全合理的,但我發現它似乎並沒有達到預期的結果。
非常感謝任何花時間閱讀本文的人。第一次試圖在這裏得到答案,我很抱歉,如果我讓它變得比它需要更加困難。
JS支持除零,PHP不支持:)。所以PHP不喜歡8/0.你應該在做操作之前檢查你的變量值,用PHP。我看到的唯一操作是* $ num%$ prime *。所以檢查$ prime和$ num。 –
不知何故$ prime的值爲0。我會檢查你的number_list函數。 – James
我包含上面的number_list函數。如果存在未定義的偏移量,那麼是否有理由將$ prime分配給「NULL」或「undefined」,這與嘗試除以0相同? 我想我只是不知道array_splice或Array.splice()在兩種語言之間的工作方式不同。在JS中,它好像拼接數組時,它只是將鍵重新分配給適當的值,所以在第一次循環後第一次numArray [2] = 3,然後numArray [2] = 5。問號? – Steve