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 に答える