2

我正在编写一个代码,突然我发现出现了一些奇怪的值。

    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" }

第 12 个元素 ([12]=> string(3) "426")$temp仅达到 11 时是如何到达那里的?我无法理解它。

4

2 回答 2

4

$output在迭代数组时更改数组不是一个好习惯。

考虑创建一个名为的新数组$result并更改此行:

 $output[$temp] = $str;

至:

 $result[$temp] = $str;

$output这样,直到循环结束时您才会触摸。

在我看来,您看到的索引很奇怪,因为您的更改会$output影响下一次迭代。

于 2013-02-03T17:39:14.443 回答
1

由于您正在覆盖参数输出数组,因此最初在数组中的元素保持在原处(除非它们的长度为!= 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);
于 2013-02-03T17:41:14.927 回答