排序一个多维数组在PHP


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, nnamevname属性对项目进行排序。

像这样:

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