1

大文字と小文字を区別しない 2 次元配列を (同様に) 実行しようとしています。

私は持っている:

foreach ($rows as $key=>$row) { 
    $names[$key]=$row['Name']; 
} 

array_multisort($rows,SORT_STRING|SORT_FLAG_CASE,$names);

上記は最終的に同じ結果を生成します(ケースフラグの有無にかかわらず)。

これを見つめるのにうんざりしています。外部の誰かからのアイデアはありますか?

4

4 に答える 4

2

まず、SORT_FLAG_CASEは PHP v5.4+ でのみ使用できるため、実行している PHP のバージョンを確認することをお勧めします (5.3 っぽい場合は ' uksort ' が役立つかもしれません)。

そうでない場合は、 $namesに入れるすべての値が小文字または大文字であることを確認してください。

array_multisortの呼び出しで、引数$rows$namesの順序が逆になっています。

最後に、それがデータベースからのものである場合 (または、配列に入る途中でデータを変更できないことを意味する他の方法)、array_walkを使用できます。

それが役立つことを願っています

于 2013-01-27T20:44:32.410 に答える
0

上記の答えはうまくいきませんでした. そこで、一般的な多次元配列の大文字と小文字を区別しない比較関数を作成しました。複数のキーを使用することもできます。

function array_casecmp($keys) {
    if (gettype($keys) != "array") $keys = func_get_args();
    return function ($a, $b) use ($keys) {
        foreach($keys as $value) {
            $akeys = $akeys . $a[$value];
            $bkeys = $bkeys . $b[$value];
        }
        return strcasecmp($akeys, $bkeys);
    };
}

次のように使用します。

usort($files,strcasecmp(array(0,1)); // with standard array
usort($files,strcasecmp(1); // single key
usort($files,strcasecmp(0,1); // arguments are converted to array
usort($files,strcasecmp("dir","link")); // you can also use symbolic keys
usort($files,strcasecmp(0,1,2,3,4,...); // use as many keys as you like

キーは連結されていることに注意してください。したがって、配列の列で str_pad を使用して、それらを正しい方法で分離しておく必要があるかもしれません。

于 2016-08-15T11:00:13.283 に答える
0

PHP 5.3.16 でこれに遭遇したので、単純な解決策を共有したいと思いました。キーを小文字 (または大文字) に変換するだけです。

foreach ($rows as $key=>$row) { 
    $names[$key]=strtolower($row['Name']); 
} 

array_multisort($names,SORT_STRING,$rows);

$rowsまた、 &を交換し、 (ログ メッセージを取り除くため) を$names削除しました。SORT_FLAG_CASE

于 2013-10-22T11:55:19.133 に答える