我没有解决在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的好文章,但是一年,我不明白它:/
答案 0 :(得分:4)
您需要使用用户定义的函数(使用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
排序。
答案 1 :(得分:3)
您可以使用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。
答案 2 :(得分:1)
我也从未理解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;
});