【PHP】===による配列の比較は順序をチェックする

  • 2020.03.08
  • PHP
【PHP】===による配列の比較は順序をチェックする

連想配列(ハッシュ)で作ったツリー構造の中に、ある配列(要するに部分木)が含まれているかをチェックする処理を実装しようと思ったときに、ふと==による配列の比較と===による配列の比較はどう違うのだろうと疑問が浮かんだ。

そこで==と===で配列の比較をした場合の違いを詳しく見てみたところ、意外なことがわかった。

Advertisement

配列の比較一覧

まずは以下の例でどちらもtrueになることを確認する。

2つの配列を比較

<?php
$a = array(
    'a' => 'x',
    'b' => 'y',
);
$b = array(
    'a' => 'x',
    'b' => 'y',
);
 
var_dump($a == $b);
var_dump($a === $b);
?>

実行結果

bool(true)
bool(true)

要素の型が違う場合

<?php
$a = array(
    'a' => '111',
    'b' => 'y',
);
$b = array(
    'a' => 111,
    'b' => 'y',
);
 
var_dump($a == $b);
var_dump($a === $b);
?>

実行結果

bool(true)
bool(false)

==では各要素でゆるやかな比較を行うようだ。

キーが違う数値の場合

<?php
$a = array(
    'a',
    'b',
);
$b = array(
    1 => 'a',
    2 => 'b',
);
 
var_dump($a == $b);
var_dump($a === $b);
?>

実行結果

bool(false)
bool(false)

さすがに、数値キーでもキーの違いがあるとfalseになるようだ。

自分でキーを割り当てた配列と自動で割り当てられた配列の場合

<?php
$a = array(
    'a',
    'b',
);
$b = array(
    0 => 'a',
    1 => 'b',
);
 
var_dump($a == $b);
var_dump($a === $b);
?>

実行結果

bool(true)
bool(true)

これは当然、両方true。

同じキーと値の要素を持つが、順序が違う配列の場合

<?php
$a = array(
    1 => 'b',
    0 => 'a',
);
$b = array(
    0 => 'a',
    1 => 'b',
);
 
var_dump($a == $b);
var_dump($a === $b);    //←この結果に注目
?>

実行結果

bool(true)
bool(false)

なんと===ではfalseが返された。ここまでの結果でこれだけは予想外だった。

念のため、文字キーでもチェックしてみる。

<?php
$a = array(
    'a' => 'x',
    'b' => 'y',
    'c' => 'z',
);
$b = array(
    'b' => 'y',
    'a' => 'x',
    'c' => 'z',
);
 
var_dump($a == $b);
var_dump($a === $b);
?>

実行結果

bool(true)
bool(false)

これでも、やはり===はfalseを返す。

===による配列の比較では、要素を入れた順序もチェックされるようだ。==と===の違いは単に各要素をゆるやかな比較をするか、厳密な比較をするかの違いだけだと思っていた。この仕様は微妙だと思うんだが、これが役に立つことはあるんだろうか?ほとんど使うことはないんだろうが、役に立つよりも、はまることの方が多そうだ・・・。

Advertisement