12

次の連想配列を考えてみましょう

$arr = Array
(        
    [banana] => 2
    [cherry] => 1
    [orange] => 3
    [grapefruit] => 1
    [apple] => 1
)

PLSQLの用語に似た方法でソートしたいと思います:(A DESC, B ASC ここで、Aは値で、Bはキーです)意味:

$arr = Array
(
    [orange] => 3
    [banana] => 2
    [apple] => 1
    [cherry] => 1
    [grapefruit] => 1        
)

オレンジとバナナが最初にVALUEであるように、次にリンゴ、チェリー、グレープフルーツが同じVALUEであるため、アルファベット順に並べています。

私が試したこと: 1。ksort()
を実行してからasort () / rsort()を実行し、他の3つの項目のアルファベット順の並べ替えを台無しにすることなく、2番目の並べ替えが配列の先頭にオレンジとバナナをぶつけてくれることを期待します。私は間違っていた。それはすべてを台無しにします。だから私はチェックアウトしました:2。ソート関数array_multisort()。しかし、どうやらそれは一度に複数の配列、または多次元配列をソートします。 3.次の比較関数も定義しようとしました。

function cmp($a, $b)
{
    foreach ($a as $key1 => $val1) {
        foreach ($b as $key2 => $val2) {
            if($val1 == $val2){
                return strcmp($key1,$key2);
            }
            else if ($val1 > $val2){
                return 1;
            }
            else{ // $val1 < $val2
                return -1;
            }
        }
    }    
} 

usort()で呼び出しますが、機能しませんでした。

だから私の質問は:要求された動作を実装するPHPメソッドはありますか?

Eugenの場合:
試してみましたが、並べ替える前に機能しません:

Array
(
    [lamb] => 3
    [rule] => 1
    [children] => 1
    [teacher] => 2
    [eager] => 1
)

ソート後:

Array
(
    [children] => 1
    [eager] => 1
    [rule] => 1
    [teacher] => 2
    [lamb] => 3
)
4

3 に答える 3

13

array_multisortを使用できます

<?php
    $arr = Array
    (        
        'banana' => 2,
        'cherry' => 1,
        'orange' => 3,
        'grapefruit' => 1,
        'apple' => 1
    );

    $values = array_values($arr);
    $keys = array_keys($arr);

    //first sort by values desc, then sort by keys asc
    array_multisort($values, SORT_DESC, $keys, SORT_ASC, $arr);

    print_r($arr);
    // output:
    /*
    Array
    (
        [orange] => 3
        [banana] => 2
        [apple] => 1
        [cherry] => 1
        [grapefruit] => 1
    )
    */

?>

それはこのように動作します:

  • ソートに使用される各列(値とキー)について、その内容で新しい1次元配列を作成します
  • これらの1次元配列をソート順でarray_multisort関数に渡し(つまり、最初に$values、次に$keys)、各配列のソート順を追加します
  • 最後の引数は、並べ替えたい配列でなければなりません

(こちらの説明の方が分かりやすいかもしれません)

于 2012-06-16T09:01:56.907 に答える
3
function polysortcmp($a, $b) {
  if ($a[1]<$b[1]) return 1;
  if ($a[1]>$b[1]) return -1;
  if ($a[0]<$b[0]) return -1;
  if ($a[0]>$b[0]) return 1;
  return 0;
}


function polysort(&$arr) {
  foreach ($arr as $k=>$v) $arr[$k]=array($k,$v);
  uasort($arr, "polysortcmp");
  foreach ($arr as $k=>$v) $arr[$k]=$v[1];
}
于 2012-06-16T08:53:47.553 に答える
0

使用される配列ソート関数arsort。

$arr = array(        
        'banana' => 2,
        'cherry' => 1,
        'orange' => 3,
        'grapefruit' => 1,
        'apple' => 1
    );

arsort($arr);
print_r($arr);

出力

Array ( [orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1 ) 
于 2012-06-16T10:04:43.533 に答える