Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按值对关联数组进行降序排序,值相同时保留顺序_Php_Arrays_Sorting - Fatal编程技术网

Php 按值对关联数组进行降序排序,值相同时保留顺序

Php 按值对关联数组进行降序排序,值相同时保留顺序,php,arrays,sorting,Php,Arrays,Sorting,我想对关联数组进行排序,并且有一个内置函数来实现相同的vizarsort(),但此函数的问题在于,当值相同时,它无法保持原始键顺序。 e、 g 我想要的结果是: $l = [ 'e' => 5, 'f' => 5, 'd' => 4, 'b' => 2, 'c' => 2, 'a' => 1 ]; arsort()以降序给出结果,但当值相同时,它会随机排列元素。 这个问题不是重复的。在这个问题中,它要求相同的数

我想对关联数组进行排序,并且有一个内置函数来实现相同的viz
arsort()
,但此函数的问题在于,当值相同时,它无法保持原始键顺序。 e、 g

我想要的结果是:

$l = [
    'e' => 5,
    'f' => 5,
    'd' => 4,
    'b' => 2,
    'c' => 2,
    'a' => 1
];
arsort()
以降序给出结果,但当值相同时,它会随机排列元素。
这个问题不是重复的。在这个问题中,它要求相同的数值按字母顺序排序,但在我的问题中,我要求数值按原始顺序排序,如果它们是相同的

您可以使用
array\u multisort
。该函数可能有点混乱,而且很难解释,但它对多个数组进行排序,并且提供的第一个数组根据后续数组的顺序进行排序

尝试:

请参见此处的示例:


它按降序对数组进行排序,然后根据数组键的排序进行更新。

可能有一种更有效的方法来实现这一点,但我认为这应该可以在相同值的组中保持原始键顺序。我将从这个数组开始,例如:

$l = [ 'a' => 1, 'b' => 2, 'c' => 2, 'd' => 4, 'g' => 5, 'e' => 5, 'f' => 5 ]; 
  • 按值对数组进行分组:

    foreach ($l as $k => $v) {
        $groups[$v][] = $k;
    }
    
    由于
    foreach
    循环按顺序读取数组,因此键将按正确顺序插入各自的组中,这将产生:

    [1 => ['a'], 2 => ['b', 'c'], 4 => ['d'], 5 => ['g', 'e', 'f'] ];
    
  • 按键按降序对组进行排序:

    krsort($groups);
    
  • 使用嵌套循环从分组数组重新组装排序数组:

    foreach ($groups as $value => $group) {
        foreach ($group as $key) {
            $sorted[$key] = $value;
        }
    }
    

  • 或者我不能复制这个。举个例子,我得到了你想要的结果(e,f,d,b,c,a),绝对是可重复的。我得到了e,f,d,c,b,a,但这对我来说不是随机的,我尝试了很多次刷新。如果是这样的话,我们可能需要编写一个自定义函数,并且您对要按特定顺序使用的键很挑剔。对于数组$l=['a'=>1,'b'=>2,'c'=>2,'d'=>4,'g'=>5,'e'=>5,'f'=>5];我希望答案是g,e,f,d,b,c,a,但它给了我e,f,g,d,b,c,a。在这种情况下,你有自定义逻辑(“g”通常在“e”和“g”之后),所以你需要实现一些自定义排序算法。你能帮我写那个逻辑吗。我的问题陈述很简单,如果值相同,那么它们遵循与原始数组相同的顺序。这不是自定义逻辑,只是顺序应该是按值,而不是按顺序key@dont-惊慌失措非常感谢您的回答和详细的解释,它的工作很好。。
    krsort($groups);
    
    foreach ($groups as $value => $group) {
        foreach ($group as $key) {
            $sorted[$key] = $value;
        }
    }