我有一个像这样的数组
Array ( [0] => Array( "destination" => "Sydney", "airlines" => "airline_1", "one_way_fare" => 100, "return_fare => 300 ), [2] => Array( "destination" => "Sydney", "airlines" => "airline_2", "one_way_fare" => 150, "return_fare => 350 ), [3] => Array( "destination" => "Sydney", "airlines" => "airline_3", "one_way_fare" => 180, "return_fare => 380 ) )
如何通过return_fare asc,one_way_fare asc?
对值进行排序我试过了array_multisort(),但我最终得到了混合数据..
asort仅适用于一维数组,我需要按两个值或更多值排序,如何在SQL中实现此功能,按field1 asc,field2 asc排序?
答案 0 :(得分:93)
array_multisort()
是正确的功能,你必须以某种方式搞砸了:
// Obtain a list of columns
foreach ($data as $key => $row) {
$return_fare[$key] = $row['return_fare'];
$one_way_fare[$key] = $row['one_way_fare'];
}
// Sort the data with volume descending, edition ascending
array_multisort($return_fare, SORT_ASC, $one_way_fare, SORT_ASC, $data);
如果你看看array_multisort()
的PHP手册页上的评论,你可以找到一个非常有用的array_orderby()
函数,它允许你将上述内容简化为:
$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC);
为避免循环使用array_column()
(从PHP 5.5.0开始):
array_multisort(array_column($data, 'return_fare'), SORT_ASC,
array_column($data, 'one_way_fare'), SORT_ASC,
$data);
答案 1 :(得分:33)
除了要求您首先构建列数组的array_multisort()
之外,还有usort()
不需要这样的事情。
usort($data, function($a, $b) {
$rdiff = $a['return_fare'] - $b['return_fare'];
if ($rdiff) return $rdiff;
return $a['one_way_fare'] - $b['one_way_fare'];
}); // anonymous function requires PHP 5.3 - use "normal" function earlier
答案 2 :(得分:9)
或者您可以使用uasort
,如下所示
uasort($arr, function($a,$b){
$c = $a['return_fare'] - $b['return_fare'];
$c .= $a['one_way_fare'] - $b['one_way_fare'];
return $c;
});
答案 3 :(得分:5)
使用宇宙飞船运营商的另一个例子。
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare']
});
答案 4 :(得分:3)
无论您要排序多少项,我都会以一种可以概括的方式回答此问题!
依次在last_read_date
和return_fare
上排序:
one_way_fare
依次选择usort($data, function($a, $b) {
if ($a['return_fare'] != $b['return_fare']) {
return $a['return_fare'] <=> $b['return_fare'];
}
return $a['one_way_fare'] <=> $b['one_way_fare'];
});
,然后依次选择return_fare
和one_way_fare
:
destination
仅在usort($data, function($a, $b) {
if ($a['return_fare'] != $b['return_fare']) {
return $a['return_fare'] <=> $b['return_fare'];
}
if ($a['one_way_fare'] != $b['one_way_fare']) {
return $a['one_way_fare'] <=> $b['one_way_fare'];
}
return strnatcasecmp($a['destination'], $b['destination']);
});
上排序:
return_fare
注意:您不必在usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
});
上使用匿名函数!
usort
您还可以使用Elvis操作符(function cmp($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
}
usort($data, 'cmp');
// Use a function inside a class:
class MyClass {
public static function compare($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
}
}
usort($data, ['MyClass', 'compare']);
)将这些链接起来:
?:
最后一个示例使用了太空飞船运营商(usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'] ?:
$a['one_way_fare'] <=> $b['one_way_fare'] ?:
strnatcasecmp($a['destination'], $b['destination']);
});
)和猫王运营商(<=>
)。编程不好吗?
答案 5 :(得分:0)
哦,我设法再次解决了我自己的问题......
function array_multi_sort($array, $on1,$on2, $order=SORT_ASC)
{
foreach($array as $key=>$value){
$one_way_fares[$key] = $value[$on2];
$return_fares[$key] = $value[$on1];
}
array_multisort($return_fares,$order,$one_way_fares,$order,$array);
}
事情是我错过了array_multisort($return_fares,$order,$one_way_fares,$order,$array);
较早!
答案 6 :(得分:0)
对我来说,最短的版本是(仅适用于PHP 7 +)
usort($data, function ($a, $b) {
return $a['return_fares'] <=> $b['return_fares'] ?: $a['one_way_fares'] <=> $b['one_way_fares'];
});