Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这在JS而不是PHP中工作?_Javascript_Php_Arrays_Array Splice - Fatal编程技术网

Javascript 为什么这在JS而不是PHP中工作?

Javascript 为什么这在JS而不是PHP中工作?,javascript,php,arrays,array-splice,Javascript,Php,Arrays,Array Splice,不久前,我们在JS的编码学校做了一个项目,在那里我们使用Eratosthenes的筛子(我无法用某种响亮的回音读懂),将所有质数输出到用户输入的数字。我们提出的代码是: JavaScript代码示例 这里的想法是通过将素数设置为下一个索引位置numArray,这应该是下一个最大的素数,从而跳过查找已删除的数的倍数这是我想弄清楚如何在PHP中实现的。我可以确认这是可行的。然而在PHP中 PHP代码示例 在未经编辑的原始帖子中,我使用了unset而不是array\u-splice。根据一个悲伤的家伙

不久前,我们在JS的编码学校做了一个项目,在那里我们使用Eratosthenes的筛子(我无法用某种响亮的回音读懂),将所有质数输出到用户输入的数字。我们提出的代码是:

JavaScript代码示例 这里的想法是通过将素数设置为下一个索引位置
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++
。无论i
unset
还是
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
)