Javascript 为什么这在JS而不是PHP中工作?
不久前,我们在JS的编码学校做了一个项目,在那里我们使用Eratosthenes的筛子(我无法用某种响亮的回音读懂),将所有质数输出到用户输入的数字。我们提出的代码是: JavaScript代码示例 这里的想法是通过将素数设置为下一个索引位置Javascript 为什么这在JS而不是PHP中工作?,javascript,php,arrays,array-splice,Javascript,Php,Arrays,Array Splice,不久前,我们在JS的编码学校做了一个项目,在那里我们使用Eratosthenes的筛子(我无法用某种响亮的回音读懂),将所有质数输出到用户输入的数字。我们提出的代码是: JavaScript代码示例 这里的想法是通过将素数设置为下一个索引位置numArray,这应该是下一个最大的素数,从而跳过查找已删除的数的倍数这是我想弄清楚如何在PHP中实现的。我可以确认这是可行的。然而在PHP中 PHP代码示例 在未经编辑的原始帖子中,我使用了unset而不是array\u-splice。根据一个悲伤的家伙
numArray
,这应该是下一个最大的素数,从而跳过查找已删除的数的倍数这是我想弄清楚如何在PHP中实现的。我可以确认这是可行的。然而在PHP中
PHP代码示例
在未经编辑的原始帖子中,我使用了unset
而不是array\u-splice
。根据一个悲伤的家伙的回答,我开始和他们两个玩起来。
无论我是unset
还是array\u-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;
}
与:
但是,即使它给我一个输出,unset
和array\u-splice
也会给我不同的结果
此代码输出数组([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;
}
函数筛选素数($input){
$numArray=编号列表($input);
$prime=2;
$count=0;
while($prime$num){
如果($num!=$prime)&&($num%$prime==0)){
阵列拼接($numArray,$key,1);
}
}
$prime++;
}
返回$numArray;
}
将阵列拼接
替换为未设置($numaray[$key])
返回:数组([0]=>2[1]=>3[3]=>5[5]=>7)
,正确答案
主要问题:
问题不是“我如何获得我想要的输出?”我相信我已经找到了实现这一目标的方法。我真的在试图理解在两种语言的幕后发生了什么,以使JS中的有效方法(上面的第一个代码块)在PHP中无效(特别是,为什么我不能将$prime
设置为数组中的下一个素数,将非素数拼接出来?)。从根本上看,它们处理拼接的方式似乎有所不同(显然PHP处理unset
和array\u-splice
的方式也有所不同,这可能是第一个问题的延伸),这似乎是一件非常有价值的事情
错误消息
以上引用了这些
注意:未定义的偏移量:2 in/Users/Guest/Desktop/test/sift.php on
第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 in/Users/Guest/Desktop/test/sift.php on
第23行
警告:在/Users/Guest/Desktop/test/sift.php中被零除
第18行
不停地,不停地
编辑
我继续做了一些重新安排/格式的工作,试图更好地阐明这个问题。这主要是为了回应“一个悲伤的家伙”的回答,他在回答中建议使用array\u-splice
而不是unset
。这个推理似乎完全有道理,但我发现它似乎没有达到预期的效果。
感谢所有花时间涉过这一关的人。第一次尝试在这里获得答案时,如果我让它变得比需要的更困难,我表示歉意。unset($a[idx])
更像a[idx]=未定义的
,而不是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;
}
您可以检查自己:
$a = [0, 1, 2, 3];
unset($a[1]);
print_r($a);
将导致:
Array
(
[0] => 0
[2] => 2
[3] => 3
)
所以通过取
$prime=$numaray[$count]代码>您将点击那些将转换为0
进行除法运算的空白点。实际上,您应该使用array\u splice
,或者重新组织代码。JS支持零除,PHP不支持:)。所以PHP不喜欢8/0。在PHP中,您应该在执行操作之前检查变量值。我看到的唯一操作是$num%$prime。所以检查$prime和$num。不知为什么,$prime的值是0。我会检查你的号码列表功能。我包括上面的号码列表功能。如果存在未定义的偏移量,那么$prime被分配到“NULL”或“未定义”是否有意义,这与尝试除以0相同?我想我只是不知道array\u splice,或者array.splice()在这两种语言之间的工作方式有什么不同。在JS中,似乎在拼接数组时,它只是将键重新分配到适当的值,因此第一次使用numArray[2]=3,然后在第一次循环后使用numArray[2]=5。问号?谢谢你。我已将其修改为数组_拼接($numArray,$key,1);不幸的是,这对更大的问题没有帮助。我不确定我是否理解。你仍然得到零误差的div吗?你能发布更新的代码吗?抱歉,还是有点新。即将在波特兰的一所代码学校度过四个月。我明白你在说那些空白点。看起来我们在处理几个变量。第一:我是否做$count++
和$prime=$numaray[$count]
或干脆$prime++
。无论iunset
还是array\u splice
,只有后者返回有效的输出(即数组)。第二:当我得到一个实际输出时,(使用$prime++
),数组拼接给我2,3,5,9(错误),而未设置给我2,3,5,7(正确)。在一秒钟内发布完整代码。
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;
}
$a = [0, 1, 2, 3];
unset($a[1]);
print_r($a);
Array
(
[0] => 0
[2] => 2
[3] => 3
)