PHPsorting数组通过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。 约翰·约翰逊的解决scheme如果他们是字符


在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这两个解决scheme,并且提出了一个可以帮助解决这个问题的函数,例如使用ASC或DESCsorting或保存键或者如果将对象作为数组的子项

这是这个function:

 /** * @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; } 

使用类似上述function的键将被删除。 如果键是重要的,下面的函数将维护它…但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。

Code credit: 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'];} );