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

У меня есть массив вроде следующего:

 массив
 (
     [0] => Массив
         (
             'name' => "Пятница"
             'weight' => 6
         )
     [1] => Массив
         (
             'name' => "Monday"
             'weight' => 2
         )
 )

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

Solutions Collecting From Web of "Как отсортировать массив PHP с помощью элемента, вложенного внутри?"

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

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

попробуйте следующее: http://php.net/manual/en/function.usort.php

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

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

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

Согласитесь с usort, я также иногда использую example_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 ) ) 

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

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

Если поданная вами сортировка является строкой, как title name ,
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 ); 

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

взял меня немного, чтобы понять, что один из …

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

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

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

 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 subkey и 'asort' или 'sort' для переменной $sort