for循环不会遍历PHP中的整个数组

时间:2017-08-27 21:06:44

标签: php arrays sorting for-loop

我使用PHP / 7.2.0beta3。所以我想创建一个自定义函数来反转PHP中的数组。如果数组是(1,2,3),则函数将其转换为(3,2,1)。

我以为我应该使用array_pop,抓取数组的最后一个值并将其传递给另一个数组。

问题

这是我写的代码。只需将其复制并以PHP身份运行即可。我不知道为什么它会在数组中间停止并且不会持续到最后。

$originalarray = range(0, 100, 5);//works
echo '<br> original array <br>';
print_r($originalarray); // 0-100, with 5 step

function customreverse($x){
    echo '<br> original array in function <br>';
    print_r($x); //works, 0-100, with 5 step
    echo '<br> sizeof in function '.sizeof($x).'<br>'; //works, is 21
    for($a=0; $a<sizeof($x); $a++){
        $reversearray[$a] = array_pop($x);
        echo '<br> reversearray in for loop <br>';
        print_r($reversearray);//stops at 50
        echo '<br> a in for loop <br>';
        echo $a;//stops at 10
    }   

    echo '<br> reverse in function <br>';
    print_r($reversearray);////stops at 50
}
customreverse($originalarray);

即使我将sizeof替换为count,也会出现同样的问题。或$a<sizeof($x)$a<=sizeof($x)。为什么它会停止并且不会遍历整个阵列?我在这里错过了什么?

由于

2 个答案:

答案 0 :(得分:4)

sizeof(或count)在循环的每次迭代中计算,并且每次迭代时数组都会收缩。您需要将原始计数存储在变量中。例如(我删除了几行以关注问题):

<?php
$originalarray = range(0, 100, 5);//works

function customreverse($x){
  $origSize=sizeof($x);
  for($a=0; $a<$origSize; $a++){
    $reversearray[$a] = array_pop($x);
  }   
  return($reversearray);//stops at 50 (Now it doesn't)
}
print_r(customreverse($originalarray));

答案 1 :(得分:1)

jh1711正确地解释了你的循环提前结束,因为for(statement1; statement2; statement3)中的中间语句在每次迭代中都被执行,并且因为你在循环中弹出原始数组,sizeOf()返回一个较小的数字每一次。

您可以通过构建反向数组来压缩代码:

while(!empty($original)) $reverse[] = array_pop($original);

如果你想保留key=>value绑定(也就是说反向键,以便相同的键绑定到相同的值),你可以这样做:

while(!empty($original)):
  $val = end($original); // set pointer at end of array
  $reverse[key($original)] = $val;
endwhile;

如果要在原地修改数组(不创建第二个数组),可以执行以下操作:

for($i=0, $j=sizeof($original); $i < $j; $i++){
    array_splice($original,$i,0,array_pop($original));
} // pop last element and insert it earlier in the array