我不明白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);
我也从来没有理解过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
s。让我们用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