在PHP中对多维数组进行排序

时间:2014-07-31 16:59:24

标签: php arrays sorting

我没有解决在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的好文章,但是一年,我不明白它:/

3 个答案:

答案 0 :(得分:4)

您需要使用用户定义的函数(使用usort)对数组进行排序。

然后,您可以使用kl_namennamevname属性手动指定您希望订购商品的方式。

这样的事情:

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;
});

DEMO:https://eval.in/173774