web-dev-qa-db-ja.com

内部にネストされた要素でPHP配列をソートするにはどうすればよいですか?

次のような配列があります:

配列
(
 [0] =>配列
(
 '名前' => "金曜日" 
 '重量' => 6 
)
 [1] =>配列
(
 '名前' => "月曜日" 
 '重量' => 2 
)
)

その配列の最後の値(「重み」)を取得し、それを使用して主要な配列要素をソートしたいと思います。したがって、この配列では、「Monday」要素が「Friday」要素の前に表示されるように並べ替えます。

38
geerlingguy

usort は次のように使用できます。

function cmp($a, $b) {
   return $a['weight'] - $b['weight'];
}

usort($arr,"cmp");
42
codaddict

無名関数を使用して実行できます。

また、 'weight'がstringの場合、他のリターンの1つを使用します(コメント化された行を参照):

<?php

$arr = array(
    0 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
    1 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
);

// sort by 'weight'
usort($arr, function($a, $b) { // anonymous function
    // compare numbers only
    return $a['weight'] - $b['weight'];

    // compare numbers or strings
    //return strcmp($a['weight'], $b['weight']);

    // compare numbers or strings non-case-sensitive
    //return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
});

var_export($arr);

/*
array (
    0 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
    1 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
)
*/
7
Geo

無名関数を使用することもできます。

usort($items, function($a, $b) {
    return $a['name'] > $b['name'];
});
5
Richard Ayotte

これを試してください: http://php.net/manual/en/function.usort.php

5
PatrickS

Usortに同意し、array_multisort( http://ca2.php.net/manual/en/function.usort.php )の例3を使用することもあります。データベースの結果を並べ替えます。あなたは次のようなことをすることができます:

<?php
$days = array(
  array('name' => 'Friday', 'weight' => 6),
  array('name' => 'Monday', 'weight' => 2),
);

$weight = array();
foreach($days as $k => $d) {
  $weight[$k] = $d['weight'];
}

print_r($days);

array_multisort($weight, SORT_ASC, $days);

print_r($days);
?>

出力:

Array
(
    [0] => Array
        (
            [name] => Friday
            [weight] => 6
        )

    [1] => Array
        (
            [name] => Monday
            [weight] => 2
        )

)
Array
(
    [0] => Array
        (
            [name] => Monday
            [weight] => 2
        )

    [1] => Array
        (
            [name] => Friday
            [weight] => 6
        )

)
3
Konel Sum

並べ替えるフィールドがtitlenameのような文字列の場合、
array_multisort + Natural Sorting およびCaseInSensitivityのフラグは、進むべき道です:

$sort_by_title = array();
foreach($items as $item) {
  $sort_by_title [] = $item['title'];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
2
d.raev

注:並べ替える要素が.0534や.0353などの浮動小数点数(パーセンテージなど)の場合は、両方に1000を掛ける必要があります。率直に言って、わかりません... usortが整数を比較しているようです値。

それを理解するのにしばらくかかりました...

すぐにはわからない2つのヒント:

  1. 配列がオブジェクトの場合、もちろん$ a-> weight-$ b-> weightを返すことができます
  2. $ b-> weight-$ a-> weightを返すと、降順でソートされます。
0
Barry