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 に答える