2015-11-04 125 views
2

在編碼學校做了一個項目,而在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++; 

但即使它給了我一個輸出,unsetarray_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甚至處理了unsetarray_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。理由似乎是完全合理的,但我發現它似乎並沒有達到預期的結果。

非常感謝任何花時間閱讀本文的人。第一次試圖在這裏得到答案,我很抱歉,如果我讓它變得比它需要更加困難。

+0

JS支持除零,PHP不支持:)。所以PHP不喜歡8/0.你應該在做操作之前檢查你的變量值,用PHP。我看到的唯一操作是* $ num%$ prime *。所以檢查$ prime和$ num。 –

+0

不知何故$ prime的值爲0。我會檢查你的number_list函數。 – James

+0

我包含上面的number_list函數。如果存在未定義的偏移量,那麼是否有理由將$ prime分配給「NULL」或「undefined」,這與嘗試除以0相同? 我想我只是不知道array_splice或Array.splice()在兩種語言之間的工作方式不同。在JS中,它好像拼接數組時,它只是將鍵重新分配給適當的值,所以在第一次循環後第一次numArray [2] = 3,然後numArray [2] = 5。問號? – Steve

回答

1

unset($a[idx])更像是a[idx] = undefined而不是splice

您可以檢查一下自己:

$a = [0, 1, 2, 3]; 
unset($a[1]); 
print_r($a); 

會導致:

Array 
(
    [0] => 0 
    [2] => 2 
    [3] => 3 
) 

因此,通過採取$prime = $numArray[$count];你會打這些空白點,這將被轉換爲0爲師操作。您應該確實使用array_splice,或者重新組織您的代碼。

+0

謝謝你。我已經修復它改爲array_splice($ numArray,$ key,1); 不幸的是,它並沒有幫助解決更大的問題。 – Steve

+0

不知道我明白。你仍然得到零誤差?你能發佈更新的代碼嗎? –

+0

我的歉意,仍然有點新。即將在波特蘭的一所代碼學校結束四個月的學習。我明白你對這些空白點的看法。看起來我們正在處理一些變量。 第一:是否執行'$ count ++'和'$ prime = $ numArray [$ count];'或者只是'$ prime ++'。只有後者纔會返回一個有效的輸出(即一個數組),無論我是「unset」還是「array_splice」。 (使用'prime ++'),'array_splice'給我2,3,5,9(錯誤),而'unset'給我2,3,5,7(正確)。在一秒內發佈完整的代碼。 – Steve

相關問題