2015-11-04 82 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