Php 使用重复值对数组排序并在值排序后保留索引顺序
我不知道为什么我会遇到这个问题,但我正在尝试对数组进行排序,例如“0,1,0,0,1,1,0,0”,以便数字1出现在末尾,但数组索引会按照其原始顺序保留 使用下面的代码示例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)后: 但是我需要做什么才能得到以下输出
<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);