fly*_*sic 64 php arrays sorting
我有一个像这样的阵列
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排序?
Tat*_*nen 101
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);
Run Code Online (Sandbox Code Playgroud)
如果您查看PHP手册页中的注释array_multisort()
,您可以找到一个非常有用的array_orderby()
功能,它允许您将上述内容简化为:
$sorted = array_orderby($data, 'return_fare', SORT_ASC, 'one_way_fare', SORT_ASC);
Run Code Online (Sandbox Code Playgroud)
为了避免循环使用array_column()
(从PHP 5.5.0开始):
array_multisort(array_column($data, 'return_fare'), SORT_ASC,
array_column($data, 'one_way_fare'), SORT_ASC,
$data);
Run Code Online (Sandbox Code Playgroud)
eta*_*ion 35
除此之外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
Run Code Online (Sandbox Code Playgroud)
Nar*_*dia 10
或者你可以使用uasort
如下
uasort($arr, function($a,$b){
$c = $a['return_fare'] - $b['return_fare'];
$c .= $a['one_way_fare'] - $b['one_way_fare'];
return $c;
});
Run Code Online (Sandbox Code Playgroud)
使用宇宙飞船运营商的另一个例子.
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'] ?: $a['one_way_fare'] <=> $b['one_way_fare']
});
Run Code Online (Sandbox Code Playgroud)
无论您希望对多少项目进行排序,我都会以一种可以概括的方式来回答这个问题!
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'];
});
Run Code Online (Sandbox Code Playgroud)
对return_fare
, then one_way_fare
, then 进行排序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']);
});
Run Code Online (Sandbox Code Playgroud)
仅排序return_fare
:
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
});
Run Code Online (Sandbox Code Playgroud)
注意:您不必使用匿名函数usort
!
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']);
Run Code Online (Sandbox Code Playgroud)
您还可以使用 Elvis 运算符 ( ?:
) 将这些链接起来:
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']);
});
Run Code Online (Sandbox Code Playgroud)
最后一个示例使用了 Spaceship Operator ( <=>
) 和 Elvis Operator ( ?:
)。编程不是很好吗?
归档时间: |
|
查看次数: |
63141 次 |
最近记录: |