1

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

3 回答 3

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);
于 2012-05-11T01:41:15.187 回答
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

于 2012-05-11T02:15:07.280 回答
0

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

于 2012-05-11T01:06:20.860 回答