这个问题旨在作为PHP中关于数组排序的问题的参考。很容易认为您的特定情况是独特的,值得提出一个新问题,但大多数情况实际上是本页上某个解决方案的微小变化。
如果你的问题是这个问题的副本,请要求重新打开你的问题,只有当你能解释为什么它与下面所有的问题都有显著不同时。
我如何排序一个数组在PHP?
我如何排序一个复杂的数组在PHP?
如何在PHP中排序对象数组?
基本一维数组;包括多维数组,包括对象数组;包括根据一个数组对另一个数组排序
用SPL排序
稳定的排序
使用PHP现有函数的实际答案见1。,关于排序算法的学术详细答案(PHP函数实现,在非常非常复杂的情况下可能需要它),请参见2。
如果有人想要一个更简单的解决方案来操作数组,只需使用Laravel Collection包,它有一个实现的sortBy函数,可以让你简单地按键排序。
$collection->sortBy('forename')->sortBy('surname');
也就是说,为了先按a,然后按b,然后按c排序,正确的子句应该是
sortBy('c')->sortBy('b')->sortBy('a')
https://packagist.org/packages/tightenco/collect
这个答案是关于多列排序的,其中数组应该在每个一维元素中根据非连续索引的值进行排序。
这与多维排序不同,因为每个元素只由不同的Key=>Value对组成。
function fncCmp( array $ItmOne, array $ItmTwo ) { ; # callback for sorting items (which are arrays) by values at specific indexes
$strCmpOne = $ItmOne[ 'ColOne' ] . $ItmOne[ 'ColThr' ]; # build compound values
$strCmpTwo = $ItmTwo[ 'ColOne' ] . $ItmTwo[ 'ColThr' ]; # to compare
return $strCmpOne <=> $strCmpTwo ; # pass back comparison-result
} # fncCmp
$arrDat = array( # define an array of items
array( 'ColOne' => 'Val2', 'ColTwo' => 'Val8', 'ColThr' => 'Val6' ) # each of which
,array( 'ColOne' => 'Val2', 'ColTwo' => 'Val9', 'ColThr' => 'Val4' ) # is an
,array( 'ColOne' => 'Val1', 'ColTwo' => 'Val7', 'ColThr' => 'Val5' ) # array of
) ; # fields
var_dump ( $arrDat ) ; # emit items before sort
$bolSrt = usort( $arrDat, 'fncCmp' ) ; # sort the array by comparing elements
var_dump ( $arrDat ) ; # emit items after sort
如果有人想要一个更简单的解决方案来操作数组,只需使用Laravel Collection包,它有一个实现的sortBy函数,可以让你简单地按键排序。
$collection->sortBy('forename')->sortBy('surname');
也就是说,为了先按a,然后按b,然后按c排序,正确的子句应该是
sortBy('c')->sortBy('b')->sortBy('a')
https://packagist.org/packages/tightenco/collect
在PHP 5.3的闭包中,也可以使用闭包来确定排序的顺序。
例如,假设$array是一个包含month属性的对象数组。
$orderArray = array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec");
usort($array, function($a, $b) use ($orderArray){
return array_search($a->month, $orderArray) - array_search($b->month, $orderArray);
});
如果你想根据多个标准的绝对最大值对数组进行排序,这里有一个简单的方法:
usort($arr, function($item, $nextItem) {
return (max($nextItem->firstNumber, $nextItem->secondNumber)) - (max($item->firstNumber, $item->secondNumber));
});
例子:
$foo = new stdClass;
$foo->createdDate = '10';
$foo->uploadedDate = '5';
$bar = new stdClass;
$bar->createdDate = '1';
$bar->uploadedDate = '12';
$baz = new stdClass;
$baz->createdDate = '25';
$baz->uploadedDate = '0';
$arr = [$foo, $bar, $baz];
// Order array by the highest number between "createdDate" and "uploadedDate".
usort($arr, function($item, $nextItem) {
return (max($nextItem->createdDate, $nextItem->uploadedDate)) - (max($item->createdDate, $item->uploadedDate));
});
结果:
array (
0 =>
(object) array(
'createdDate' => '25',
'uploadedDate' => '0',
),
1 =>
(object) array(
'createdDate' => '1',
'uploadedDate' => '12',
),
2 =>
(object) array(
'createdDate' => '10',
'uploadedDate' => '5',
),
)
最简单的方法是使用usort函数对数组进行排序,而不需要任何循环:
下面是一个例子:
$array_compare= array("0" =>4,"1"=>2,"2"=>500,"3"=>100);
这将按降序排序:
usort($array_compare, function($a, $b) {
return ($b['x1'] - $a['x1']) > 0 ? 1 :-1;
});
这将按发送顺序排序:
usort($array_compare, function($a, $b) {
return ($b['x1'] - $a['x1']) < 0 ? 1 :-1;
});