it-swarm.com.ru

Как мне отсортировать PHP массив элементом, вложенным внутрь?

У меня есть массив, как следующий:

 Array 
 (
 [0] => Array 
 (
 'Name' => "Friday" 
 'Weight' => 6 
) 
 [1 ] => Array 
 (
 'Name' => "Monday" 
 'Weight' => 2 
) 
) 

Я хотел бы получить последние значения в этом массиве («вес») и использовать его для сортировки основных элементов массива. Итак, в этом массиве я хочу отсортировать его так, чтобы элемент «Monday» появлялся перед элементом «Friday».

34
geerlingguy

Вы можете использовать usort как:

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

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

Может быть сделано с помощью анонимной функции .

Также, если ваш 'weight' - это строка используйте один из других возвратов (см. Закомментированные строки):

<?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,
    ),
)
*/
6
Geo

попробуйте это: 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

Вы также можете использовать анонимную функцию.

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

Если поле, по которому вы сортируете, является строкой типа titlename,
array_multisort + Флаги для Естественная сортировка и 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 );
1
d.raev

ПРИМЕЧАНИЕ: если элемент, по которому вы сортируете, - это число с плавающей точкой, например .0534 и .0353 (например, в процентах), то вам нужно умножить оба на 1000. не уверен, почему, честно говоря ... кажется, что usort сравнивает целое число ценности.

мне понадобилось время, чтобы понять это ...

и 2 совета, которые могут быть не очевидны сразу:

  1. если ваши массивы являются объектами, вы можете использовать return $ a-> weight - $ b-> weight, конечно
  2. если вы вернете $ b-> weight - $ a-> weight, он будет отсортирован по убыванию.
0
Barry