問題描述
在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中文網其他相關文章!