PHP Сортировка массива по значению SubArray

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

Array ( [0] => Array ( [configuration_id] => 10 [id] => 1 [optionNumber] => 3 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [1] => Array ( [configuration_id] => 9 [id] => 1 [optionNumber] => 2 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [2] => Array ( [configuration_id] => 8 [id] => 1 [optionNumber] => 1 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) ) 

Каков наилучший способ упорядочения массива поэтапно, основываясь на optionNumber?

Таким образом, результаты выглядят так:

 Array ( [0] => Array ( [configuration_id] => 8 [id] => 1 [optionNumber] => 1 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [1] => Array ( [configuration_id] => 9 [id] => 1 [optionNumber] => 2 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) [2] => Array ( [configuration_id] => 10 [id] => 1 [optionNumber] => 3 [optionActive] => 1 [lastUpdated] => 2010-03-17 15:44:12 ) ) 

Используйте usort .

 function cmp_by_optionNumber($a, $b) { return $a["optionNumber"] - $b["optionNumber"]; } ... usort($array, "cmp_by_optionNumber"); 

В PHP ≥5.3 вместо этого вы должны использовать анонимную функцию :

 usort($array, function ($a, $b) { return $a['optionNumber'] - $b['optionNumber']; }); 

Обратите внимание, что оба вышеуказанных кода предполагают, что $a['optionNumber'] является целым числом. Используйте @St. Решение Джона Джонсона, если они являются струнами.


В PHP ≥7.0 используйте оператор космического корабля <=> вместо вычитания, чтобы предотвратить проблемы с переполнением / усечением.

 usort($array, function ($a, $b) { return $a['optionNumber'] <=> $b['optionNumber']; }); 

Использовать usort

  usort($array, 'sortByOption'); function sortByOption($a, $b) { return strcmp($a['optionNumber'], $b['optionNumber']); } 

Я использовал оба решения KennyTM и AJ Quick и придумал функцию, которая может помочь в этой проблеме для многих случаев, например, для сортировки или сохранения ключей ASC или DESC или если у вас есть объекты в виде дочерних элементов массива .

Вот эта функция:

 /** * @param array $array * @param string $value * @param bool $asc - ASC (true) or DESC (false) sorting * @param bool $preserveKeys * @return array * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) { if ($preserveKeys) { $c = array(); if (is_object(reset($array))) { foreach ($array as $k => $v) { $b[$k] = strtolower($v->$value); } } else { foreach ($array as $k => $v) { $b[$k] = strtolower($v[$value]); } } $asc ? asort($b) : arsort($b); foreach ($b as $k => $v) { $c[$k] = $array[$k]; } $array = $c; } else { if (is_object(reset($array))) { usort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }); } else { usort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }); } } return $array; } 

Применение:

 sortBySubValue($array, 'optionNumber', true, false); 

редактировать

Первая часть может быть переписана с использованием uasort() и функция будет короче:

 /** * @param array $array * @param string $value * @param bool $asc - ASC (true) or DESC (false) sorting * @param bool $preserveKeys * @return array * */ function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) { if (is_object(reset($array))) { $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }) : usort($array, function ($a, $b) use ($value, $asc) { return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); }); } else { $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }) : usort($array, function ($a, $b) use ($value, $asc) { return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); }); } return $array; } 

Клавиши удаляются при использовании функции, аналогичной приведенной выше. Если ключи важны, следующая функция будет поддерживать его … но петли foreach довольно неэффективны.

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

Используйте arsort вместо asort, если хотите от максимума до минимума.

Кодовый кредит: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/

PHP 5.3+

 usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];} );