对数组值进行排序,但不更改原始键顺序

我有一个看起来像这样的数组:


$array = array(

  '5' => 2,

  '6' => 3,

  '7' => 10,

  '8' => 1

);    

我希望它看起来像这样:


$array = array(

  '5' => 1,

  '6' => 2,

  '7' => 3,

  '8' => 10

);

键应保持不变,但值应按升序排列。sort()键将被删除并替换为从 0 开始的键。将asort()按照我想要的方式对值进行排序,但它将保持键关联。


我尝试过sort(),但这些似乎都不是我需要的排序功能usort()。asort()我必须手动排序还是有可以使用的功能?


莫回无
浏览 80回答 2
2回答

慕莱坞森

您可以使用 提取数组的键array_keys,使用 对值进行排序sort,然后使用 将键与排序后的值组合起来array_combine:$array = array('5' => 2,'6' => 3,'7' => 10,'8' => 1);  $keys = array_keys($array);sort($array);$array = array_combine($keys, $array);print_r($array);输出:Array(    [5] => 1    [6] => 2    [7] => 3    [8] => 10)3v4l.org 上的演示

侃侃无极

您可以sort()通过将调用捕获到匿名函数调用中来将调用与全局范围隔离。这执行与 Nick 的答案相同的操作,但不声明全局范围的变量,不修改原始数组,并且可以写成一行。我承认这是一个可读性较差的变体。代码:(演示)var_export(    array_combine(        array_keys($array),        (fn($v) => sort($v) ? $v : $v)($array)    ));
打开App,查看更多内容
随时随地看视频慕课网APP