-1

有这样的数组。

Array
(
    [0] => Array
        (
            [tipo] => Mn
            [tsk] => Vr
            [date] => 14-06
            [J] => 4
            [H] => 0
            [O] => 0
        )

[1] => Array
    (
        [tipo] => Ds
        [tsk] => Mv
        [date] => 14-06
        [J] => 0
        [H] => 0,5
        [O] => 0
    )

[2] => Array
    (
        [tipo] => Vr
        [tsk] => Do
        [date] => 14-06
        [J] => 0
        [H] => 0
        [O] => 5
    )

[3] => Array
    (
        [tipo] => Cl
        [tsk] => REG
        [date] => 14-06
        [J] => 0
        [H] => 4.25
        [O] => 0
    )

[4] => Array
    (
        [tipo] => Cl
        [tsk] => MB10
        [date] => 14-06
        [J] => 0
        [H] => 3.5
        [O] => 0
    )


)

我需要按 J、H 和 O 键对其进行排序。我的意思是,我需要首先拥有所有在 J 上具有值的子数组,然后是在 H 上具有值的子数组,然后是在 O 上具有值的子数组。 注意:这些列是互斥的,所以如果一个列有值大于 0,其他两个只能有 0。

我已经尝试了很多事情,但显然这个看似简单的任务已经超出了我的想象。我得到的最接近的是array_multisort,但我无法让它工作。我认为这样的事情应该有效:

foreach ($data as $key => $row) {
    $J[$key] = $row['J'];
    $H[$key] = $row['H'];
    $O[$key] = $row['O'];
}
array_multisort($J, SORT_ASC, $H, SORT_ASC, $O, SORT_ASC, $data);

但事实并非如此。

4

2 回答 2

2

使用排序

 usort($data, function($a, $b){
         if (($a["J"] - $b["J"]) != 0) return $a["J"] - $b["J"];
         if (($a["H"] - $b["J"]) != 0) return $a["H"] - $b["H"];
         if (($a["O"] - $b["O"]) != 0) return $a["O"] - $b["O"];
         return 0;             
 });

更新

上述方法仅在排序的值是数字时才有效,我注意到数据不是,所以这应该适合你。

 usort($data, function($a, $b){
         if ($a["J"] > $b["J"]) return 1;
         if ($a["J"] < $b["J"]) return -1;
         if ($a["H"] > $b["H"]) return 1;
         if ($a["H"] < $b["H"]) return -1;
         if ($a["O"] > $b["O"]) return 1;
         if ($a["O"] < $b["O"]) return -1;
         return 0;             
 });

 ?>
于 2013-06-14T16:02:40.890 回答
1

您必须将数组传递给 array_multisort 这不是您正在做的事情:

尝试这样的事情:

foreach ($data as $key => $row) {
    $sortMe['J'][] = $row['J'];
    $sortMe['H'][] = $row['H'];
    $sortMe['O'][] = $row['O'];
}


array_multisort($sortMe['J'], SORT_DESC, SORT_NUMERIC,
                $sortMe['H'], SORT_ASC, SORT_REGULAR,
                $sortMe['O'], SORT_DESC, SORT_NUMERIC);

请注意, sortMe 是字母 'J'、'H'、'O' 中的一个数组,因为我使用 [] 在 foreach 循环中添加项目,这就是你做错了。

希望这对您有所帮助。

于 2013-06-14T16:29:41.523 回答