PHP - 如何通过比较两个不同的子数组值对多维数组进行排序

时间:2013-01-26 16:35:01

标签: php arrays sorting

我已经厌倦了找到排序这个多维数组的方法。 我试过usort(),但它没有按照我想要的方式排序。或者只是也许我无法弄清楚要使用的正确逻辑。 usort()对我来说似乎很难理解。

我想对我的数据进行排序(下面的示例),首先查找每个子数组的值越高(键a和b 之间的)。然后,从其键a或b中具有最高值的子数组将位于顶部。

例如这个数组:

Array
(
    [0] => Array
        (

         [a]=>5
         [b]=>
         [c]=>apple

        )

    [1] => Array
        (

         [a]=>5
         [b]=>7
         [c]=>guava

        )

    [2] => Array
        (

         [a]=>6
         [b]=>
         [c]=>banana

        )
    [3] => Array
        (

         [a]=>5
         [b]=>
         [c]=>avocado

        )

)

应按如下方式排序:

Array
(
    [0] => Array
        (

         [a]=>5
         [b]=>7
         [c]=>guava

        )

    [1] => Array
        (

         [a]=>6
         [b]=>
         [c]=>banana

        )

    [2] => Array
        (

         [a]=>5
         [b]=>
         [c]=>apple

        )
    [3] => Array
        (

         [a]=>5
         [b]=>
         [c]=>avocado

        ) 

那么我究竟能做到这一点?我很困惑如何使用usort。用于排序的最佳PHP函数是什么?

3 个答案:

答案 0 :(得分:3)

usort()的工作方式是,它需要一种方法来比较数组的元素,以决定最先出现的是什么。您为它提供了一个函数,它为输入数组中的每个元素对调用该函数。如果函数返回负值,则意味着第一个参数小于第二个参数,并且应该在排序数组中位于它之前。如果它返回正值,则相反。

假设您正在比较两个子阵列s1s2。使用您提供的逻辑,s1“小于”s2 - 也就是说,s1应该在s2之前 - 如果max(s1.a,s1.b) > max(s2.a,s2.b)。因此,如果为真,则sort函数应返回负值。如果从s1的最大值中减去s2的最大值,则应该得到正确的结果。

试试这个:

function sort_function(array $arr1, array $arr2) {
    $arr1_val = max($arr1['a'],$arr1['b']);
    $arr2_val = max($arr2['a'],$arr2['b']);
    return $arr2_val - $arr1_val;
}

usort($arr,sort_function);

假设$arr是你的数组。

答案 1 :(得分:2)

您的比较功能:

function cmp($a,$b){
    // clean up the keys so they don't cause weird cross-type comparisons
    (empty($a['a']) ? $a['a'] = 0 : NULL;
    (empty($a['b']) ? $a['b'] = 0 : NULL;
    (empty($b['a']) ? $b['a'] = 0 : NULL;
    (empty($b['b']) ? $b['b'] = 0 : NULL;

    /// figure out the pertinent value to compare
    $value_from_a_to_compare = max($a['a'],$a['b']);
    $value_from_b_to_compare = max($b['a'],$b['b']);

    if($value_from_a_to_compare ==  $value_from_b_to_compare) {
        return 0;
    }

    if($value_from_a_to_compare >  $value_from_b_to_compare) {
        return 1;
    } else {
       return -1;
    }


}

从usort中调用

usort($your_array,'cmp');
var_dump($your_array);

答案 2 :(得分:2)

有几种方法,包括编写dethtron5000编写的函数,可以让你使用usort。

我将描述一个不同的建议:创建一个辅助数组,在其中放置第一个数组中的最高数字,然后使用array_multisort使用辅助数组中的值对它们进行排序。

$helper = array();
foreach ($data as $value)
{
    $helper[] = max($value['a'],$value['b']);
}
array_multisort($helper,$data);