为什么这适用于JS而不是PHP?

时间:2015-11-04 23:03:25

标签: javascript php arrays array-splice

我们使用 Eratosthenes的筛子(我无法用某种蓬勃发展的,回声的声音读到)中的编码学校的一个项目输出所有素数直到用户输入的数字。我们提出的代码是:

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。根据一个悲伤的家伙的回答,我开始玩两个人。

无论是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;
}

array_splice替换unset($numArray[$key])返回:
Array ( [0] => 2 [1] => 3 [3] => 5 [5] => 7 ),正确答案。

主要问题:

问题不是&#34;如何获得我想要的输出?&#34;我相信我已经想出如何实现这一目标。我真的想要了解两种语言中幕后发生的事情,以便在JS(上面的第一个代码块)中创建一个有效的方法,这是PHP中的一个无效方法(具体来说,为什么我不能设置)拼接非素数后,$prime成为数组中的下一个素数?)。看起来他们在基本层面上处理拼接的方式不同(显然PHP甚至处理unsetarray_splice的方式也不同,这可能是第一个问题的扩展),这似乎是一件非常有价值的事情。理解。

错误消息

上面引用了

  

注意:未定义的偏移量:/Users/Guest/Desktop/test/sift.php中的2   第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行

     

注意:未定义的偏移量:/Users/Guest/Desktop/test/sift.php中的4   第23行

     

警告:在/Users/Guest/Desktop/test/sift.php上分为零   第18行

一直等待......

修改

我继续做了一些重新排列/格式化以尝试更好地表达问题。这主要是为了回应一个悲伤的家伙的回复,&#34;他建议使用array_splice代替unset。这个推理似乎完全有道理,但我发现它似乎没有预期的结果。

感谢任何花时间跋涉此事的人。第一次尝试在这里得到答案,如果我让它变得比它需要的更难,我表示道歉。

1 个答案:

答案 0 :(得分: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,或者重新组织您的代码。