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


У меня есть массив, подобный следующему:

Array
(
    [0] => Array
        (
            'name' => "Friday"
            'weight' => 6
        )
    [1] => Array
        (
            'name' => "Monday"
            'weight' => 2
        )
)

Я хотел бы захватить последние значения в этом массиве ("вес") и использовать их для сортировки основных элементов массива. Итак, в этом массиве я бы хотел отсортировать его так, чтобы элемент "Понедельник" появлялся перед элементом "Пятница".

Author: codaddict, 2010-09-13

8 answers

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

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

usort($arr,"cmp");
 37
Author: codaddict, 2010-09-13 15:34:31

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

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

<?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
Author: Geo, 2014-04-18 17:49:04

Попробуйте это: http://php.net/manual/en/function.usort.php

 5
Author: PatrickS, 2010-09-13 15:30:35

Согласен с 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
Author: Konel Sum, 2010-09-13 15:46:43

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

usort($items, function($a, $b) {
    return $a['name'] > $b['name'];
});
 2
Author: Richard Ayotte, 2014-11-13 16:13:16

Если файл, по которому вы сортируете, является строкой, подобной title name,
array_multisort + Флаги для Естественной сортировки и Чувствительности к регистру - это путь:

$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
Author: d.raev, 2016-07-26 14:31:06

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

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

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

  1. если ваши массивы являются объектами, вы можете использовать return $a->вес- $b->вес, конечно
  2. если вы вернете $b->вес - $a->вес, это будет сортировка по желанию.
 0
Author: Barry, 2017-08-17 01:18:42

Вот классная функция, которая может помочь:

function subval_sort($a,$subkey,$sort) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    if($b)
    {
        $sort($b);
        foreach($b as $key=>$val) {
            $c[] = $a[$key];
        }
        return $c;
    }
}

Отправьте в массив как $a ключ как $subkey и "сортировку" или "сортировку" для переменной $sort

 -1
Author: d2burke, 2010-09-13 15:51:01