関数・クラス解説

array_udiff

version:PHP 5, PHP 7 (公式)

データの比較にコールバック関数を用い、配列の差を計算する

公式リファレンス

書式

array_udiff ( array $array , array ...$arrays , callable $value_compare_func ) : array

callback ( mixed $a, mixed $b ) : int

説明

データの比較にコールバック関数を用い、配列の差を計算します。 この関数は array_diff() と異なり、 データの比較に内部関数を利用します。

パラメータ

array
最初の配列。
arrays
比較対象の配列。
value_compare_func
比較用のコールバック関数。 比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。

返値

他の引数のいずれにも存在しない array の値の全てを有する配列を返します。

注意

注意: この関数は n 次元配列の一つの次元しかチェックしないことに注意してください。 もちろん、array_udiff($array1[0], $array2[0], "data_compare_func"); のようにすることでより深い次元でのチェックもできます。

サンプル

例1 array_udiff() で stdClass オブジェクトを使う例

// 比較する配列 $array1 = array(new stdclass, new stdclass,                 new stdclass, new stdclass,                ); $array2 = array(                 new stdclass, new stdclass,                ); // オブジェクトにプロパティを設定します $array1[0]->width = 11; $array1[0]->height = 3; $array1[1]->width = 7;  $array1[1]->height = 1; $array1[2]->width = 2;  $array1[2]->height = 9; $array1[3]->width = 5;  $array1[3]->height = 7; $array2[0]->width = 7;  $array2[0]->height = 5; $array2[1]->width = 9;  $array2[1]->height = 2; function compare_by_area($a, $b) {     $areaA = $a->width * $a->height;     $areaB = $b->width * $b->height;          if ($areaA < $areaB) {         return -1;     } elseif ($areaA > $areaB) {         return 1;     } else {         return 0;     } } print_r(array_udiff($array1, $array2, 'compare_by_area'));

上の例の出力は以下となります。

Array ( [0] => stdClass Object ( [width] => 11 [height] => 3 ) [1] => stdClass Object ( [width] => 7 [height] => 1 ) )

例2 array_udiff() で DateTime オブジェクトを使う例

class MyCalendar {     public $free = array();     public $booked = array();     public function __construct($week = 'now') {         $start = new DateTime($week);         $start->modify('Monday this week midnight');         $end = clone $start;         $end->modify('Friday this week midnight');         $interval = new DateInterval('P1D');         foreach (new DatePeriod($start, $interval, $end) as $freeTime) {             $this->free[] = $freeTime;         }     }     public function bookAppointment(DateTime $date, $note) {         $this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note);     }     public function checkAvailability() {         return array_udiff($this->free, $this->booked, array($this, 'customCompare'));     }          public function customCompare($free, $booked) {         if (is_array($free)) $a = $free['date'];         else $a = $free;         if (is_array($booked)) $b = $booked['date'];         else $b = $booked;         if ($a == $b) {             return 0;         } elseif ($a > $b) {             return 1;         } else {             return -1;         }     } } // 毎週の予約用のカレンダーを作ります $myCalendar = new MyCalendar; // 今週の予約を入れます $myCalendar->bookAppointment(new DateTime('Monday this week'), "Cleaning GoogleGuy's apartment."); $myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Going on a snowboarding trip."); $myCalendar->bookAppointment(new DateTime('Friday this week'), "Fixing buggy code."); // 空きが何日あるかを調べるため、$booked の日数と $free の日数を比べます echo "I'm available on the following days this week...\n\n"; foreach ($myCalendar->checkAvailability() as $free) {     echo $free->format('l'), "\n";  } echo "\n\n"; echo "I'm busy on the following days this week...\n\n"; foreach ($myCalendar->booked as $booked) {     echo $booked['date']->format('l'), ": ", $booked['note'], "\n";  }

上の例の出力は以下となります。

I'm available on the following days this week... Tuesday Thursday I'm busy on the following days this week... Monday: Cleaning GoogleGuy's apartment. Wednesday: Going on a snowboarding trip. Friday: Fixing buggy code.

参考

  • array_diff() - 配列の差を計算する
  • array_diff_assoc() - 追加された添字の確認を含めて配列の差を計算する
  • array_diff_uassoc() - ユーザーが指定したコールバック関数を利用し、 追加された添字の確認を含めて配列の差を計算する
  • array_udiff_assoc() - データの比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
  • array_udiff_uassoc() - データと添字の比較にコールバック関数を用い、 追加された添字の確認を含めて配列の差を計算する
  • array_intersect() - 配列の共通項を計算する
  • array_intersect_assoc() - 追加された添字の確認も含めて配列の共通項を確認する
  • array_uintersect() - データの比較にコールバック関数を用い、配列の共通項を計算する
  • array_uintersect_assoc() - データの比較にコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
  • array_uintersect_uassoc() - データと添字の比較に個別のコールバック関数を用い、 追加された添字の確認も含めて配列の共通項を計算する
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール