PHP按两个字段值排序数组

时间:2011-01-03 07:09:40

标签: 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排序?

7 个答案:

答案 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;
});

Fiddle

答案 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_datereturn_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_fareone_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);

上的最后一个参数$ 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'];
    });