You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:03