PHP多维数组按值降序排序:如何保留原键名?
解决方案:保留键名的降序排序
你遇到的问题核心是用错了排序函数:
- 第一次代码没生效,是因为foreach里的
$key是原数组的值拷贝,修改它不会影响原$data数组; - 第二次用
rsort虽然能排序,但这个函数会重置数组索引,自然丢了键名。
要实现「按数值降序+保留原键名」,直接用arsort()函数就行,它专门用来对数组按值降序排序且保留关联键。
修改后的代码可以这样写(用引用传递直接修改原数组):
foreach($data as $key1 => &$array) { foreach($array as $key2 => &$item) { if($item['type'] == 'options') { arsort($item['options'], SORT_NUMERIC); } } } // 解除引用,避免后续操作意外修改数组 unset($array, $item);
或者不用引用,直接操作原数组下标:
foreach($data as $key1 => $array) { foreach($array as $key2 => $item) { if($item['type'] == 'options') { arsort($data[$key1][$key2]['options'], SORT_NUMERIC); } } }
排序后options数组会变成:
Array ( [tooth] => 1 [sparks] => 1 [asprin] => 0 )
既按数值降序排列,又完整保留了tooth、sparks这些原键名。
补充几个排序函数的区别:
rsort():对数组降序排序,重置索引(丢失关联键)arsort():对数组降序排序,保留关联键krsort():按键名降序排序,和数组值无关
内容的提问来源于stack exchange,提问作者asprin
相关产品推荐
相关产品推荐

