2

私はusortで使用するカスタムのsort-funktionを持っています:

function cmp($wert_a, $wert_b) {
$a = $wert_a["name"];
$b = $wert_b["name"];

if ($a == $b) {
   return 0;
}

return ($a < $b) ? -1 : +1; 
}

今、私がこのような配列を持っているとき:5a,10b,6c,HR9,44x それはそれをに分類し10b,44x,5a,6c,HR9ます。

次のように並べ替えてもらいたい5a,6c,10b,44x,HR9

これはどのように達成できますか?

編集:私が実際に言及しなかったことの1つ(私はコードで行いましたが、テキストではありませんでした)は、それが次のような多次元配列であるということです:

$array[0]["name"] = "5b";
$array[0]["..."] = "other values";
$array[1]["name"] = "10a";
$array[1]["..."] = "other values";

natsortとfriendsを使用して、このように並べ替えることはできません。

4

3 に答える 3

5

natsort()を使用することをお勧めします。作成しようとしているものと同じように動作します。

多次元配列を並べ替えるには、次を参照してください: http ://www.php.net/manual/en/function.array-multisort.php#61976

function array_key_multi_sort($arr, $l , $f='strnatcasecmp')
{
    usort($arr, create_function('$a, $b', "return $f(\$a['$l'], \$b['$l']);"));
    return($arr);
}
于 2012-09-09T17:38:11.273 に答える
1

a文字を自然な順序(前)で並べ替える場合は、Hを使用できますnatcasesort。次の配列について考えてみます。

$array = array('5a', '10b', '6c', 'HR9', '44x', 'a9');

使用natsort

Array
(
    [0] => 5a
    [2] => 6c
    [1] => 10b
    [4] => 44x
    [3] => HR9
    [5] => a9
)

使用natcasesort

Array
(
    [0] => 5a
    [2] => 6c
    [1] => 10b
    [4] => 44x
    [5] => a9
    [3] => HR9
)

編集: 出力で、ソート後もインデックスが同じままであることがわかります。したがって、連想配列を並べ替えるには、1次元のコピーを作成し、そのインデックスを使用して連想配列にアクセスします。ソートされた配列を反復処理するときforeachではなく、使用することを忘れないでください。for

于 2012-09-09T18:00:12.340 に答える
0

を除く配列内のすべての項目についてHR9、phpのnatsort()関数はソートをかなりうまく処理します。数字以外の文字を無視し、数字の文字であるかのように並べ替えます。

これがnatsort()のドキュメントです。 http://us.php.net/natsort

$array = array(5a,10b,6c,HR9,44x);

natsort($array);

新しい注文は次のようになります。

5a,6c,HR9,10b,44x

この後、並べ替え関数を使用して、いずれかの文字列の最初の文字が数値以外の場合にのみ並べ替えることができます。

多次元配列に関して:

$temp_array = array();
foreach($array as $key => $value):

$temp_array[$key] = $value['name'];


endforeach;

natsort($temp_array);

これにより、キーが元の配列の要素番号であり、値が「名前」である順序付けられた連想配列が得られます。

あなたは出来る

于 2012-09-09T17:52:29.207 に答える