2012-05-11 93 views
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 
(
    [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]); 
+1

一种解决方案可能是添加$ I * 0.01的地方,我是分类和排序,然后服用后地板前的指数每个元素。但是这似乎很不妥。 – sank

+0

我的想法与sank相似,只是解决方案稍微清晰一些,即使它略显“粗糙”。 – Robin

+0

干杯家伙,我会牢记这一点,这是一个很好的建议。 – Scuzzy

回答

1

()。例如:

$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

+0

我发现一个[array_multisort页面中的用户评论](http://us.php.net/manual/en/function.array-multisort.php#107477),实现了我想要的,我修改了我的上述问题展示它。 – Scuzzy

+0

我会给你接受,因为它导致我找到解决方案。 – Scuzzy

0

您可能需要使用array_merge()重置数组的键。

+0

谢谢,但我想保留数组键,否则我会使用array_values() – Scuzzy

+0

我会进一步解释,键的顺序被用于引用另一个数组,我使用这个简单的数组重新排序一个更复杂的结构。 – Scuzzy

+1

对不起,我错过了。 –

1

你需要通过组值的数组和个人组进行排序:如果密钥需要匹配起来,然后我建议你用在array_multisort

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

是的,我刚写完自己的(也许比你有更复杂的),但它现在是我唯一的选择。 – Scuzzy