-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 より大きい場合、他の 2 つは 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 を使用する

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

[] を使用して foreach ループにアイテムを追加しているため、sortMe は文字 'J'、'H'、'O' の配列であることに注意してください。

これがお役に立てば幸いです。

于 2013-06-14T16:29:41.523 に答える