簡體   English   中英

在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_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排序。

您可以為此使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM