使用重复值对数组进行排序,并在值排序后保留索引顺序

时间:2012-05-11 01:01:54

标签: php

我不知道为什么我遇到这个问题,但我正在尝试对数组进行排序,例如“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
)

执行asort($ 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]);

3 个答案:

答案 0 :(得分:1)

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

$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);

答案 1 :(得分:1)

如果密钥需要匹配,那么我建议你使用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

答案 2 :(得分:0)

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