なぜこれに問題があるのか わかりませんが、「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]);