php對二維數組重新排序失敗怎麼回事

PHPz
發布: 2023-04-18 09:27:49
原創
657 人瀏覽過

問題描述

在php中,對於一個二維數組,有時需要按照某個鍵值進行排序,我們一般會使用array_multisort()函數進行排序,但有些情況下排序卻失敗了。
例如:存在一個二維數組$arr,要根據鍵值"name"進行降序排序,程式碼如下:

$arr = array(
    array('name' => 'Tom', 'age' => 18),
    array('name' => 'Jerry', 'age' => 20),
    array('name' => 'Bob', 'age' => 25),
    array('name' => 'Alice', 'age' => 22),
);

// 按照'name'进行降序排序
array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
登入後複製

但是,對於某些情況下,用上面的程式碼會導致排序失敗,原因及解決方法是什麼呢?下文將為大家分析。

排查問題

在這樣的問題中,一般情況下最好的方法是先列印出要排序的數組,觀察到底是不是排序的鍵值沒有定義、資料格式錯誤或其他問題。如果列印出的陣列格式正確,可以試著進行程式碼調試。

下面,我們使用var_dump()函數來列印$arr數組看看:

// 打印一下原数组,查看键名和键值
var_dump($arr);
登入後複製

輸出結果:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(3) "Tom"
    ["age"]=>
    int(18)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(5) "Jerry"
    ["age"]=>
    int(20)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["age"]=>
    int(25)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["age"]=>
    int(22)
  }
}
登入後複製

我們可以看到,鍵名和鍵值的格式都是正確的,但為什麼排序會失敗呢?

問題分析

我們再次查看上面的程式碼,可以發現在使用array_multisort()函數時,使用了array_column()函數來提取要排序的鍵值,這裡就有可能存在問題。

array_column()函數可以提取出一維數組中的某個鍵名對應的值,但如果數組是多維的,它只會將第一維當做一維數組,而不是將整個多維數組轉換為一維數組。這就會導致在使用array_multisort()函數時錯誤地引用了索引資料。下面我們針對這個問題進行說明。

變數$arr是一個二維數組,我們使用array_column()函數提取出鍵名為"name"的值,結果如下:

// 提取出键名为'name'的值
$name = array_column($arr, 'name');
var_dump($name);
登入後複製

輸出結果:

array(4) {
  [0]=>
  string(3) "Tom"
  [1]=>
  string(5) "Jerry"
  [2]=>
  string(3) "Bob"
  [3]=>
  string(5) "Alice"
}
登入後複製

如上所示,我們只得到了一個一維數組,這就會導致在排序時,其他鍵名對應的值就遺失了。於是,我們可以嘗試將多維數組轉換為一維數組,然後再使用array_multisort()函數來進行排序。

解決方案

有兩種方法可以將多維數組轉換為一維數組,即使用array_walk_recursive()函數或foreach()循環遍歷多維數組。這裡我們將以array_walk_recursive()函數為例來說明。

下面我們來看看如何使用array_walk_recursive()函數將多維數組轉換為一維數組:

// 定义一个函数将多维数组转换为一维数组
function array_multi2single(&$data){
    static $result_array = array();
    array_walk_recursive($data, function($value, $key) use(&$result_array){
        $result_array[$key] = $value;
    });
    $data = $result_array;
}

// 将多维数组转换为一维数组
array_multi2single($arr);
登入後複製

轉換後的$arr數組如下:

array(8) {
  ["name"]=>
  string(5) "Alice"
  ["age"]=>
  int(22)
  [0]=>
  string(3) "Tom"
  [1]=>
  string(5) "Jerry"
  [2]=>
  string(3) "Bob"
  [3]=>
  string(5) "Alice"
  [4]=>
  int(18)
  [5]=>
  int(20)
}
登入後複製

將多維數組轉換為一維數組之後,我們可以重新使用array_multisort()函數對數組進行排序:

// 将多维数组转换为一维数组
array_multi2single($arr);
// 按照'name'进行降序排序
array_multisort(array_column($arr, 'name'), SORT_DESC, $arr);
登入後複製

排序後的數組如下所示:

array(4) {
  [0]=>
  array(2) {
    ["name"]=>
    string(5) "Jerry"
    ["age"]=>
    int(20)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["age"]=>
    int(25)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["age"]=>
    int(22)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(3) "Tom"
    ["age"]=>
    int(18)
  }
}
登入後複製

在完成多維數組轉換之後,我們重新使用array_multisort()函數對陣列進行排序,此時排序就可以正常進行了。

以上是php對二維數組重新排序失敗怎麼回事的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!