我正在写一个代码,突然间我发现,出现了一些奇怪的值。
function purify($output){
$temp = 0;
$max_index = count($output);
for($i=0;$i < $max_index; $i++){
if(strlen($output[$i]) == 3){
$str = str_split($output[$i]);
arsort($str);
$str = implode($str);
$output[$temp] = $str;
$temp++;
}
else unset($output[$i]);
}
return array_unique($output);
}
当我传递由这些元素组成的数组时:
11 115 165 138 999 885 999 456 135 726 642 425 426
我得到了这个输出:
array(11) { [1]=> string(3) "651" [2]=> string(3) "831" [3]=> string(3) "999" [4]=> string(3) "885" [6]=> string(3) "654" [7]=> string(3) "531" [8]=> string(3) "762" [9]=> string(3) "642" [10]=> string(3) "542" [12]=> string(3) "426" [0]=> string(3) "511" }
当$temp
仅达到11时,第12个元素([12] =&gt; string(3)“426”)是如何到达那里的?我无法理解它。
答案 0 :(得分:4)
在迭代数组时更改数组$output
并不是一个好习惯。
考虑创建一个名为$result
的新数组并更改此行:
$output[$temp] = $str;
为:
$result[$temp] = $str;
这样,在循环结束之前,您不会触摸$output
。
在我看来,您看到了奇怪的索引,因为$output
的更改会影响下一次迭代。
答案 1 :(得分:1)
由于您要覆盖参数 output 数组,因此数组中最初的元素保持不变(除非它们的长度为!= 3)。
也许你可以试试
function purify($output){
$result = array();
$max_index = count($output);
for($i=0;$i < $max_index; $i++){
if(strlen($output[$i]) == 3){
$str = str_split($output[$i]);
arsort($str);
$result[] = implode($str);
}
}
return array_unique($result);
}
顺便说一句,你真的想使用arsort
而不是rsort
吗? rsort
因为使用索引数组(而不是关联数组)而有意义。
rsort($str);