1

[A1] -> [A20]、[B1] -> [B20] などの形式のキーを持つ配列があり、最初に使用してその配列を並べ替えようとしていますksort()(文字を正しい順序で取得するため) ) そしてuksort().

ただし、uksort()関数をどのように記述すればよいかわかりません。また、配列キーが奇妙な順序で戻ってきます。誰かが見て、私が間違っていることについてアドバイスしてもらえますか? ありがとう。

function _sort_selection_keys($a, $b){

    $let_a = substr($a, 0, 1);
    $let_b = substr($b, 0, 1);
    $num_a = intval(substr($a, 1));
    $num_a = intval(substr($b, 1));

    /** Check that the first letter is the same. It should be, as the array has already been through 'ksort()', but it's worth checking any way */
    if($let_a !== $let_b) :
        return strcasecmp($a, $b);
    endif;

    if($num_a > $num_b) :
        return -1;
    elseif($num_a = $num_b) :
        return 0;
    elseif($num_a < $num_b) :
        return 1;
    endif;

}
4

5 に答える 5

1

ドキュメントにusortよると:

比較関数は、最初の引数がそれぞれ 2 番目の引数より小さい、等しい、または大きいと見なされる場合、0 より小さい、等しい、または大きい整数を返さなければなりません。

つまり、trueorを返す代わりに、返す必要falseがあります$num_a - $num_b(または比較を行い、-1、、1または0.

于 2013-04-10T15:52:12.040 に答える
1

自然な順序でキーで配列をソートしたい:

ksort($array, SORT_NATURAL);

を参照してくださいksort()

自然な並べ替え順序は次のとおりです。

regular:  A1, A10, A11, A2, A20, A21, ... A3, ...
natural:  A1, A2, A3, ..., A10, A11, ... A20, A21 
于 2013-04-10T16:02:15.550 に答える
1

まず、2 番目の "$num_a" 行を "$num_b" に変更するだけでよいと思います。それ以外は、あなたが試みているすべての解剖の代わりに、キーに strnatcasecmp() を使用するだけです。

于 2013-04-10T15:54:25.143 に答える