2

連想配列をその値の 1 つでソートするにはどうすればよいですか?

例えば:

$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

$arr = ???

foreach ($arr as $person)
    echo $person['age'], ', ';

したがって、出力は次のようになります。

18, 24, 27

これは、私の質問を示すためだけに簡略化した例です。

私はまだそれ$arrが連想配列である必要があります。

4

5 に答える 5

7

これは、PHP 5.3 の無名関数が役立つ古典的な例です。

uasort($arr, function($a, $b) {
    return $a['age'] - $b['age'];
});

これ$a['age'] - $b['age']はちょっとしたトリックです。これは、コールバック関数が値 < 0 は$aより小さい値を返し、より大きい$b場合は値 > 0を返すことが期待されるため機能します。$a$b

于 2011-03-31T11:03:03.030 に答える
7

このuasort()関数を使用すると、2 つの要素間の比較を行うコールバック関数を指定できます。適切なコールバック関数を実装すれば、うまくいくはずです。

ここでは、2 つの配列を受け取り、ageitemを比較するコールバック関数を実装する必要があります。

function callback($a, $b) {
  if ($a['age'] > $b['age']) {
    return 1;
  } else if ($a['age'] < $b['age']) {
    return -1;
  }
  return 0;
}


コードの次の部分でその関数を使用します。

$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

uasort($arr, 'callback');
var_dump($arr);

この結果の配列が得られます:

array
  'bob' => 
    array
      'age' => int 18
  'jay' => 
    array
      'age' => int 24
  'ted' => 
    array
      'age' => int 27
于 2011-03-31T11:01:40.533 に答える
1

http://www.php.net/manual/en/array.sorting.php

この特定のケースでは、コールバックを使用して並べ替える並べ替えメソッドの 1 つを使用する必要があります。

于 2011-03-31T11:00:21.813 に答える
1

サブ配列内の値でソートしているため、100% の作業を行う組み込み関数はありません。ユーザー定義の並べ替えを次のように行います。

http://www.php.net/manual/en/function.uasort.php

ネストされた配列内のこの値に基づいて比較を返す比較関数の例を次に示します。

<?php
// Comparison function
function cmp($left, $right) {
    $age1 = $left['age'];
    $age2 = $right['age'];
    if ($age1 == $age2) {
        return 0;
    }
    return ($age1 < $age2) ? -1 : 1;
}

uasort($array, 'cmp');
于 2011-03-31T11:01:25.990 に答える
0

連想配列を並べ替えるだけでなく、連想配列の連想配列を並べ替えます;)

uasort呼び出しはあなたが求めているものです

uasort($array, function ($a, $b) {
    if ($a['age'] === $b['age']) {
        return 0;
    }
    return $a['age'] > $a['age'] ? 1 : -1;
});
于 2011-03-31T11:14:04.103 に答える