PHP – проверьте, равны ли два массива

Я бы хотел проверить, равны ли два массива. Я имею в виду: тот же самый размер, тот же индекс, одинаковые значения. Как я могу это сделать?

Используя === как было предложено пользователем, я ожидаю, что следующее будет печатать, если хотя бы один элемент в массиве (-ах) отличается, но на самом деле это не так.

 if (($_POST['atlOriginal'] !=== $oldAtlPosition) or ($_POST['atl'] !=== $aext) or ($_POST['sidesOriginal'] !=== $oldSidePosition) or ($_POST['sidesOriginal'] !=== $sideext)) { echo "enter"; } 

Related of "PHP – проверьте, равны ли два массива"

 $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types. 

См. Операторы массива .

РЕДАКТИРОВАТЬ

Оператор неравенства равен != то время как не тождественный оператор равен !== для соответствия оператору равенства == и тождественному оператору === .

Согласно этой странице .

ПРИМЕЧАНИЕ . Принимаемый ответ работает для ассоциативных массивов, но он не будет работать так, как ожидалось, с индексированными массивами (поясняется ниже). Если вы хотите сравнить любой из них, используйте это решение. Кроме того, эта функция может не работать с многомерными массивами (из-за характера функции array_diff).

Тестирование двух индексированных массивов, элементы которых находятся в другом порядке, с использованием $a == $b или $a === $b , например:

 <?php (array("x","y") == array("y","x")) === false; ?> 

Это связано с тем, что вышеупомянутое означает:

array(0 => "x", 1 => "y") против array(0 => "y", 1 => "x") .

Чтобы решить эту проблему, используйте:

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

Было добавлено сравнение размеров массива (предложенное super_ton), поскольку оно может улучшить скорость.

Попробуйте сериализовать. Это также проверит вложенные подмассивы.

 $foo =serialize($array_foo); $bar =serialize($array_bar); if ($foo == $bar) echo "Foo and bar are equal"; 

Сравните их как другие значения:

 if($array_a == $array_b) { //they are the same } 

Вы можете прочитать обо всех операциях массива здесь: http://php.net/manual/en/language.operators.array.php Обратите внимание, например, что === также проверяет, что типы и порядок элементов в массивах являются одна и та же.

!=== не будет работать, потому что это синтаксическая ошибка. Правильный способ: !== (не три символа «равно»)

Вы можете использовать array_diff_assoc для проверки различий между ними.

Один из способов: (реализация «считается равной» для http://tools.ietf.org/html/rfc6902#section-4.6 )

Этот способ позволяет ассоциативные массивы, члены которых упорядочены по-разному – например, они будут считаться равными на каждом языке, но php 🙂

 // recursive ksort function rksort($a) { if (!is_array($a)) { return $a; } foreach (array_keys($a) as $key) { $a[$key] = ksort($a[$key]); } // SORT_STRING seems required, as otherwise // numeric indices (eg "0") aren't sorted. ksort($a, SORT_STRING); return $a; } // Per http://tools.ietf.org/html/rfc6902#section-4.6 function considered_equal($a1, $a2) { return json_encode(rksort($a1)) === json_encode(rksort($a2)); } 

Другой метод проверки равенства независимо от порядка значений работает с помощью http://php.net/manual/en/function.array-intersect.php , например:

 $array1 = array(2,5,3); $array2 = array(5,2,3); if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) { echo 'Equal'; } else { echo 'Not equal'; } 

Вот версия, которая также работает с многомерными массивами, используя http://php.net/manual/en/function.array-uintersect.php :

 $array1 = array( array(5, 2), array(3, 6), array(2, 9, 4) ); $array2 = array( array(3, 6), array(2, 9, 4), array(5, 2) ); if($array1 === array_uintersect($array1, $array2, 'compare') && $array2 === array_uintersect($array2, $array1, 'compare')) { echo 'Equal'; } else { echo 'Not equal'; } function compare($v1, $v2) { if ($v1===$v2) { return 0; } if ($v1 > $v2) return 1; return -1; } 

array_diff – вычисляет разницу в массивах

http://php.net/manual/en/function.array-diff.php

 array array_diff ( array $array1 , array $array2 [, array $... ] ) 

Сравнивает array1 с одним или несколькими другими массивами и возвращает значения в array1 , которые не присутствуют ни в одном из других массивов.

Рабочее короткое решение, которое работает даже с массивами, ключи которых приведены в другом порядке:

 public static function arrays_are_equal($array1, $array2) { array_multisort($array1); array_multisort($array2); return ( serialize($array1) === serialize($array2) ); } 

Используйте php-функцию array_diff (array1, array2);

Он вернет разницу между массивами. Если его пустые, то они равны.

пример:

 $array1 = array( 'a' => 'value1', 'b' => 'value2', 'c' => 'value3' ); $array2 = array( 'a' => 'value1', 'b' => 'value2', 'c' => 'value4' ); $diff = array_diff(array1, array2); var_dump($diff); //it will print array = (0 => ['c'] => 'value4' ) 

Пример 2:

 $array1 = array( 'a' => 'value1', 'b' => 'value2', 'c' => 'value3', ); $array2 = array( 'a' => 'value1', 'b' => 'value2', 'c' => 'value3', ); $diff = array_diff(array1, array2); var_dump($diff); //it will print empty;