'Tom', 'age' => 18), array('na"/> 'Tom', 'age' => 18), array('na">
问题描述
在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中文网其他相关文章!