Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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 - Fatal编程技术网

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

Php 使用重复值对数组排序并在值排序后保留索引顺序,php,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> 执行asort($array)后: 但是我需要做什么才能得到以下输出

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

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

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


编辑:这真的很混乱,但作为一个例子,解决了我想要实现的问题

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

解决方案:使用数组的方法\u multisort()


您可能需要使用
array\u merge()
重置数组键。

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

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

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

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


谢谢,但我正试图保留数组键,否则我将使用数组_值()我将进一步解释,键的顺序将用于引用另一个数组,我用这个简单的数组对一个复杂得多的结构进行重新排序,一个解决方案是在每个元素中添加$I*0.01,其中I是排序前的索引,然后在排序后进行排序。但这似乎很愚蠢。我的想法与Sunk的想法相似,只是解决方案更清晰一些,尽管它有点“粗鲁”。干杯,伙计们,我会记住这一点,这是一个很好的建议。是的,我刚写完我自己的(可能比你们的更复杂)但这似乎是我目前唯一的选择。我找到了一个可以实现我想要的目标的方法,我已经修改了我的上述问题来证明这一点。我会接受你,因为这会引导我找到解决方案。
Array
(
    [0] => 0
    [2] => 0
    [3] => 0
    [6] => 0
    [7] => 0
    [1] => 1
    [4] => 1
    [5] => 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 = 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 = 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 =        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);