[英]Multidimensional array Sort by Key
具有這樣的數組。
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;
});
?>
您必須將不是您正在執行的操作的數組傳遞給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循環中添加了項,這就是您做錯的。
希望這對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.