Перевірте, чи рівні значення двох масивів у PHP

Сніппет

1) Порівняння масивів з використанням суворої рівності (===)

Два масиви строго рівні ($a === $b), коли:

  • у них однакові пари ключ/значення
  • пари ключ/значення знаходяться в тому ж порядку
  • всі значення одного типу

2) Порівняння масивів з використанням вільної рівності (==)

Два масиви "слабко" рівні ($a == $b) коли у них однакові пари ключ/значення

Приклади порівняння 1 та 2 масивів

Масиви, що мають однакові пари ключ/значення в одному порядку та зі значеннями одного типу:

downloadcopy
<?php
$a = ['a', 'b'];
$b = ['a', 'b'];

var_dump($a == $b); // true
var_dump($a === $b); // true

$a = ['a', 'b'];
$b = [0 => 'a', 1 => 'b'];

var_dump($a == $b); // true
var_dump($a === $b); // true

Асоціативні масиви:

downloadcopy
<?php
$a = ['a', 'b', [ 'foo' => 'bar' ]];
$b = ['a', 'b', [ 'foo' => 'bar' ]];

var_dump($a == $b); // true
var_dump($a === $b); // true

$a = ['a', 'b', [ 'foo' => 'bar' ]];
$b = [0 => 'a', 1 => 'b', 3 => [ 'foo' => 'bar' ]];

var_dump($a == $b); // true
var_dump($a === $b); // true

Масиви, що мають однакові пари ключ/значення в одному порядку, але з різними типами ключів:

downloadcopy
<?php
$a = [0 => 'a', 1 => 'b', 2 => 'c'];
$b = [false => 'a', true => 'b', '2' => 'c'];

var_dump($a == $b); // true
var_dump($a === $b); // true

Масиви, у яких різні пари ключ/значення:

downloadcopy
<?php
$a = ['a', 'b'];
$b = ['b', 'a'];

var_dump($a == $b); // false
var_dump($a === $b); // false

$a = [0 => 'a', 1 => 'b'];
$b = [0 => 'b', 1 => 'a'];

var_dump($a == $b); // false
var_dump($a === $b); // false

Асоціативні масиви:

downloadcopy
<?php
$a = [1 => 'a', 2 => 'b', [ 'foo' => 'bar' ]];
$b = [[ 'foo' => 'bar' ], 2 => 'b', 1 => 'a'];

var_dump($a == $b); // false
var_dump($a === $b); // false

$a = [1 => 'a', 2 => 'b', 3 => [ 'foo' => 'bar' ]];
$b = [0 => [ 'foo' => 'bar' ], 2 => 'b', 1 => 'a'];

var_dump($a == $b); // false
var_dump($a === $b); // false

Значення масивів різного типу:

downloadcopy
<?php
$a = [1, 2, 3];
$b = ['1', 2, 3];

var_dump($a == $b); // true
var_dump($a === $b); // false

$a = [false, true];
$b = [0, 3];

var_dump($a == $b); // true
var_dump($a === $b); // false

Масиви різного порядку:

downloadcopy
<?php
$a = [1 => 'a', 2 => 'b'];
$b = [2 => 'b', 1 => 'a'];

var_dump($a == $b); // true
var_dump($a === $b); // false

Але з індексованими масивами це не працюватиме належним чином

downloadcopy
<?php
$a = [0 => 'a', 1 => 'b'];
$b = [0 => 'b', 1 => 'a'];

var_dump($a == $b); // false
var_dump($a === $b); // false

Щоб вирішити цю проблему, використовуйте:

downloadcopy
<?php
function arrayEqual($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}

$a = [0 => 'a', 1 => 'b'];
$b = [0 => 'b', 1 => 'a'];

var_dump(arrayEqual($a, $b)); // true