[英]Sort a multi-dimensional Array in PHP
我不理解在php中對多維數組進行排序的方法。 我有這樣的結構:
Array (
[0] (
['vname'] => "Bernt"
['nname'] => "Mayer"
['kl_name'] => "ZR4"
)
[1] (
['vname'] => "Albert"
['nname'] => "Mayer"
['kl_name'] => "TR4"
)
)
我現在的目標是首先按kl_name排序,然后依次按nname和vname排序。 最重要的是kl_name。 首先,我要制造對象並將它們存儲在數組中,但是我認為對它們進行排序更加復雜。 php.net有一篇關於array_multisort的不錯的文章,但是一年,我不明白:/
您需要使用用戶定義的函數(使用usort )對數組進行排序。
然后,您可以使用kl_name
, nname
和vname
屬性手動指定要訂購的商品的方式。
像這樣:
usort($arr, function($a, $b) {
if ($a['kl_name'] !== $b['kl_name']) {
return strcmp($a['kl_name'], $b['kl_name']);
} else if ($a['nname'] !== $b['nname']) {
return strcmp($a['nname'], $b['nname']);
} else {
return strcmp($a['vname'], $b['vname']);
}
});
如果所有先前值都相等,則該函數將首先嘗試按kl_name
排序,然后按nname
排序,最后按vname
排序。
您可以為此使用array_multisort
。
// Obtain a list of columns
foreach ($data as $key => $row) {
$kl_name[$key] = $row['kl_name'];
$nname[$key] = $row['nname'];
$vname[$key] = $row['vname'];
}
// Sort
array_multisort($kl_name, SORT_ASC, $nname, SORT_ASC, $vname, SORT_ASC, $data);
有關更多詳細信息,請參見http://php.net/array_multisort 。
我也從不了解array_multisort
。 我只是將usort
用於這樣的事情。 您要做的是,比較第一個字段,如果相同,則比較第二個字段...依此類推。
因此,它看起來像這樣(假設$data
是您的數組)。
usort($data, function($a, $b){
$sort_kl_name = strnatcasecmp($a['kl_name'], $b['kl_name']);
if($sort_kl_name === 0){
$sort_nname = strnatcasecmp($a['nname'], $b['nname']);
if($sort_kl_name === 0){
return strnatcasecmp($a['vname'], $b['vname']);
}
return $sort_nname;
}
return $sort_kl_name;
});
這看起來有點雜亂,有很多if
。 讓我們用一個foreach
簡化它。
$sortLevels = array('kl_name', 'nname', 'vname');
usort($data, function($a, $b) use($sortLevels){
foreach($sortLevels as $field){
$sort = strnatcasecmp($a[$field], $a[$field]);
if($sort !== 0){
break;
}
}
return $sort;
});
演示: https : //eval.in/173774
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.