Php 多维数组按键排序

Php 多维数组按键排序,php,arrays,sorting,Php,Arrays,Sorting,有这样一个数组 Array ( [0] => Array ( [tipo] => Mn [tsk] => Vr [date] => 14-06 [J] => 4 [H] => 0 [O] => 0 ) [1] => Array ( [tipo

有这样一个数组

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);
但事实并非如此

使用usort

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

 ?>
usort($data,function($a,$b){
如果($a[“J”]>$b[“J”])返回1;
如果($a[“J”]<$b[“J”])返回-1;
如果($a[“H”]>$b[“H”])返回1;
如果($a[“H”]<$b[“H”])返回-1;
如果($a[“O”]>$b[“O”])返回1;
如果($a[“O”]<$b[“O”])返回-1;
返回0;
});
?>

您必须将一个数组传递给数组\u 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循环中添加项,这就是您所做的错误


希望这对您有所帮助。

我做了一些调整,但效果不错。它们应该都是数值,我不知道“0,5”是怎么计算的。到了那里。它应该是“0.5”。因此,当我找到并修复它们时,我会将它们视为常规。我仍然需要考虑数组的多重排序函数,因为老实说,我还没有完全理解这里发生了什么。是的,伙计,很高兴它帮助你意识到了问题所在,这是一个有点棘手的函数我同意你的看法,顺便说一句,在官方文件中,使用浮点数并不是最好的选择,有人说SORT_NUMERIC对浮点数不起作用。试一下,直到你对结果感到满意为止。