array_uniqueとsuper_unique

著者:杉浦

array_uniqueとsuper_unique

 PHPにはarray_uniqueという組み込み関数があります。
PHP: array_unique – Manual
 効果は次の引用の通りシンプルで配列の中身をユニークなものにします。

array_unique
( array $array
[, int $sort_flags = SORT_STRING
] ) : array

array を入力とし、値に重複のない新規配列を返します。

引用:PHP: array_unique – Manual

 この第二引数sort_flagsはsortなどとついていますが、実質的にcompare_flagsともいうべきものです。array_uniqueは次の通りに配列の中身の値を扱って比較します。

  • SORT_REGULAR – 通常の比較
    (型変換をしない) を行います
  • SORT_NUMERIC – 数値として比較します
  • SORT_STRING – 文字列として比較します
  • SORT_LOCALE_STRING
    現在のロケールにもとづいて文字列として比較します。

引用:PHP: array_unique – Manual

 ちなみにデフォルトはSORT_STRINGです。数値、文字列以外はSORT_REGULARでそれっぽく動きます。

注意:

array_unique() は、
多次元配列での使用を想定したものではないことに注意しましょう。

引用:PHP: array_unique – Manual

 それっぽいといった通り、多重配列であったり配列の中身の型がまちまちだった場合、array_uniqueは意図しない挙動を起こしだします。この問題は昔からあった様で解決策はPHP: array_unique – Manual #97285にありました。

recursive array unique for multiarrays

<?php
function super_unique($array)
{
  $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = super_unique($value);
    }
  }

  return $result;
}

 やっていることは配列の中身をserialize(値の保存可能な表現を生成)し、配列の中身を一旦全て文字列に変換、array_uniqueを実行、unserializeで元の型に復元、です。このsuper_uniqueを用いることでより直感的なarray_uniqueの挙動を実現できます。

  • この記事いいね! (0)

著者について

杉浦 administrator