Я бы хотел проверить, равны ли два массива. Я имею в виду: тот же самый размер, тот же индекс, одинаковые значения. Как я могу это сделать?
Используя ===
как было предложено пользователем, я ожидаю, что следующее будет печатать, если хотя бы один элемент в массиве (-ах) отличается, но на самом деле это не так.
if (($_POST['atlOriginal'] !=== $oldAtlPosition) or ($_POST['atl'] !=== $aext) or ($_POST['sidesOriginal'] !=== $oldSidePosition) or ($_POST['sidesOriginal'] !=== $sideext)) { echo "enter"; }
$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;