在编码学校做了一个项目,而在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