5
<?php

    $a = array(
        'a'=>'7833',
        'd'=>'1297',
        'c'=>'341',
        '1'=>'67',
        'b'=>'225',
        '3'=>'24',
        '2'=>'44',
        '4'=>'22',
        '0'=>'84'
    );

    ksort($a);

    print_r($a);

上記のコードは次の出力を生成します。

Array
(
    [0] => 84
    [a] => 7833
    [b] => 225
    [c] => 341
    [d] => 1297
    [1] => 67
    [2] => 44
    [3] => 24
    [4] => 22
)

ksortが間違った結果を出すのはなぜですか?

4

6 に答える 6

11

SORT_STRING フラグを使用する必要があります。SORT_REGULAR はアイテムを現在のタイプと比較します。この場合、数値 1 は文字列 'a' の後に来ます。

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
于 2012-03-24T16:12:00.000 に答える
10

デフォルトのソートは を使用しますSORT_REGULAR

これは値を取得し、比較演算子のマニュアル ページで説明されているようにそれらを比較します。あなたの例では、文字列キーがゼロと比較されるとき。0これらの文字列は、比較のため に数値 (すべて) に変換されます。2 つのメンバーが等しいと比較された場合、並べ替えられた配列内の相対的な順序は未定義です。( usort() マニュアルページから引用。)

ソートされた出力で文字の前に数字を表示したい場合はSORT_NATURAL、PHP 5.4 以降を使用する必要があります。 また、数値が1桁のままの場合にのみSORT_STRINGジョブを実行します。

SORT_NATURAL (PHP 5.4 以降) は、キーの順序を次のように指定します。

0,1,2,4,11,a,b,c

SORT_STRINGは、次の順序でキーを指定します。

0,1,11,2,4,a,b,c

SORT_NATURALPHP 5.4 未満の場合の代替手段は、 useuksort()です。

uksort($a, 'strnatcmp');
于 2012-03-24T16:16:05.163 に答える
1

ksort($a, SORT_STRING)キーの文字列比較を強制してみてください。

于 2012-03-24T16:11:08.580 に答える
1

これはうまくいきます:

<?php ksort($a,SORT_STRING); ?>

ここで他の sort_flags をチェックしてください http://www.php.net/manual/es/function.sort.php

乾杯!

于 2012-03-24T16:12:59.513 に答える
-1

PHP のさまざまなソート関数の概要については、このページを参照してください: http://php.net/manual/en/array.sorting.php

キーでソートしたい場合は、asort() を使用すると、次の出力が生成されます。

Array
(
    [4] => 22
    [3] => 24
    [2] => 44
    [1] => 67
    [0] => 84
    [b] => 225
    [c] => 341
    [d] => 1297
    [a] => 7833
)
于 2012-03-24T16:12:55.517 に答える