对具有重复值的数组进行排序,并在值排序后保留索引顺序


Sorting an array with repeating values and retaining the index order after value sort

我不确定为什么我遇到这个问题,但我正在尝试对诸如"0,1,0,0,1,1,0,0"之类的数组进行排序,以便数字 1 出现在末尾,但数组索引按照其原始顺序保留。

使用以下代码示例

<pre><?php
  $array = array(0,1,0,0,1,1,0,0);
  print_r($array);
  asort($array);
  print_r($array);
?></pre>

从原始数组开始:

Array
(
    [0] => 0
    [1] => 1
    [2] => 0
    [3] => 0
    [4] => 1
    [5] => 1
    [6] => 0
    [7] => 0
)

执行排序($array)后:

Array
(
    [6] => 0
    [7] => 0
    [0] => 0
    [3] => 0
    [2] => 0
    [1] => 1
    [5] => 1
    [4] => 1
)

但是我需要做什么才能获得以下输出?(注意索引顺序)

Array
(
    [0] => 0
    [2] => 0
    [3] => 0
    [6] => 0
    [7] => 0
    [1] => 1
    [4] => 1
    [5] => 1
)

我真的想避免做进一步的处理循环来按不同的值组对索引重新排序(即对值为"0"的项目上的所有索引进行排序,然后对值为"1"的项目进行排序并合并结果)


编辑:这真的很混乱,但解决了我想实现的示例

print_r(stupid_array_order_hack($array));
function stupid_array_order_hack($array) {
  if(isset($array) === TRUE AND is_array($array) === TRUE) {
    $reordering_group = array();
    $reordering_merge = array();
    // Group the index's by value
    foreach($array as $key => $value) {
      $reordering_group[$value][] = $key;
    }
    // sort the grouped index's
    foreach($reordering_group as $key => $value) {
      asort($reordering_group[$key]);
      $reordering_merge = array_merge($reordering_merge,$reordering_group[$key]);
    }
    return array_replace(array_flip($reordering_merge),$array);
  }
  return $array;
}

解决方案:使用 array_multisort() 的方法

$array = array(0,1,0,0,1,1,0,0);
$temp = array($array,array_keys($array));
array_multisort($temp[0],SORT_ASC,$temp[1],SORT_ASC);
$array = array_combine($temp[1], $temp[0]);

如果键需要匹配,那么我建议你使用 array_multisort()。例如:

$array =        array(0,1,0,0,1,1,0,0);
$other_array =  array(1,2,3,4,5,6,7,8);
array_multisort($array, $other_array);

这将对两个数组进行排序,以便数组使键顺序匹配。

http://us.php.net/manual/en/function.array-multisort.php

您需要

按值对数组进行分组并对各个组进行排序:

$array = array(0,1,0,0,1,1,0,0);
$groups = array();
foreach ($array as $key => $value) {
    $groups[$value][$key] = $value;
}
ksort($groups);
$array = array();
foreach ($groups as $group) {
    $array += $group;
}
print_r($array);

您可能希望使用 array_merge() 来重置数组键。