php对二维数组重新排序失败怎么回事
时间:2023-04-18 10:10
问题描述 在php中,对于一个二维数组,有时候需要按照某个键值进行排序,我们一般会使用array_multisort()函数进行排序,但有些情况下排序却失败了。 但是,对于某些情况下,用上面的代码会导致排序失败,原因及解决方法是什么呢? 下文将为大家分析。 排查问题 在这样的问题中,一般情况下最好的方法是先打印出要排序的数组,观察到底是不是排序的键值没有定义、数据格式错误或其他问题。如果打印出的数组格式正确,可以试着进行代码调试。 下面,我们使用var_dump()函数来打印一下$arr数组看看: 输出结果: 我们可以看到,键名和键值的格式都是正确的,但为什么排序会失败呢? 问题分析 我们再次查看上面的代码,可以发现在使用array_multisort()函数时,使用了array_column()函数来提取要排序的键值,这里就有可能存在问题。 array_column()函数可以提取出一维数组中的某个键名对应的值,但如果数组是多维的,它只会将第一维当做一维数组,而不是将整个多维数组转换为一维数组。这就会导致在使用array_multisort()函数时错误地引用了索引数据。下面我们针对这个问题进行说明。 变量$arr是一个二维数组,我们使用array_column()函数提取出键名为"name"的值,结果如下: 输出结果: 如上所示,我们只得到了一个一维数组,这就会导致在排序时,其他键名对应的值就丢失了。于是,我们可以尝试将多维数组转换为一维数组,再使用array_multisort()函数来进行排序。 解决方案 有两种方法可以将多维数组转换为一维数组,即使用array_walk_recursive()函数或foreach()循环遍历多维数组。这里我们将以array_walk_recursive()函数为例进行说明。 下面我们来看一下如何使用array_walk_recursive()函数将多维数组转换为一维数组: 转换后的$arr数组如下所示: 将多维数组转换为一维数组之后,我们可以重新使用array_multisort()函数对数组进行排序: 排序后的数组如下所示: 在完成多维数组转换之后,我们重新使用array_multisort()函数对数组进行排序,此时排序就可以正常进行了。 以上就是php对二维数组重新排序失败怎么回事的详细内容,更多请关注Gxl网其它相关文章!
例如:存在一个二维数组$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);
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) }}
// 提取出键名为'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"}
// 定义一个函数将多维数组转换为一维数组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);
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_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) }}