41
$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other'),
);

重複している場合は削除したため、結果は次のようになります。

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other')   
);

これを行う方法を知っている人はいますか?

ありがとう

4

2 に答える 2

76

array_unique他の人がここで提供しているものに関係なく、 Docsという関数を探しています。ここで重要なことは、2 番目のパラメーターを に設定することです。そうすればSORT_REGULAR、作業は簡単になります。

array_unique($result, SORT_REGULAR);

SORT_REGULARフラグの意味は次のとおりです。

アイテムを通常どおり比較する (タイプを変更しない)

そして、それがあなたが望むものです。ここで配列ドキュメント比較し、それらの型を文字列に変更しないでください (パラメーターが設定されていない場合は、これがデフォルトになります)。

array_unique厳密な比較 ( ===PHP の場合) を行います。配列の場合、これは次のことを意味します。

$a === $b TRUE$a と $b が同じキーと値のペアを同じ順序で同じ型で持っている場合。

出力 (デモ):

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )
)
于 2012-12-13T12:44:04.330 に答える
26

まず最初に、array_uniquearray_unique は内部的に配列項目を文字列として扱うため、この問題にプレーンを使用することはできません。

だからこれを試してください:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other')
);

$unique = array_map("unserialize", array_unique(array_map("serialize", $result)));

print_r($unique);

結果:

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )

)

このような問題には、シリアル化が非常に便利です。

魔法が多すぎると感じたら、このブログ投稿をチェックしてください

function array_multi_unique($multiArray){

  $uniqueArray = array();

  foreach($multiArray as $subArray){

    if(!in_array($subArray, $uniqueArray)){
      $uniqueArray[] = $subArray;
    }
  }
  return $uniqueArray;
}

$unique = array_multi_unique($result);

print_r($unique);

皮肉なことに、in_array配列では機能しますが、そうではありarray_uniqueません。

于 2012-12-13T10:32:17.890 に答える