我使用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)
。为什么它会停止并且不会遍历整个阵列?我在这里错过了什么?
由于
答案 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