1

我厌倦了寻找对这个多维数组进行排序的方法。我已经尝试过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 函数是什么?

4

3 回答 3

3

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

假设您正在比较两个子数组s1s2. 使用您提供的逻辑,s1是“小于” s2- 也就是说,s1应该在s2- if之前max(s1.a,s1.b) > max(s2.a,s2.b)。因此,如果这是真的,排序函数应该返回一个负值。如果你从 ' 的最大值中减去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是你的数组。

于 2013-01-26T17:07:15.550 回答
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);
于 2013-01-26T17:00:55.417 回答
2

有几种方法,包括编写 dethtron5000 编写的函数,使您能够使用 usort。

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

$helper = array();
foreach ($data as $value)
{
    $helper[] = max($value['a'],$value['b']);
}
array_multisort($helper,$data);
于 2013-01-26T17:03:58.687 回答