PHP - проверьте, равны ли два массива
Я хотел бы проверить, равны ли два массива. Я имею в виду: тот же размер, тот же индекс, те же значения. Как я могу это сделать?
Используя !==
как предложено пользователем, я ожидаю, что следующее напечатало бы ввод, если хотя бы один элемент в массиве (ах) отличается, но на самом деле это не так.
if (($_POST['atlOriginal'] !== $oldAtlPosition)
or ($_POST['atl'] !== $aext)
or ($_POST['sidesOriginal'] !== $oldSidePosition)
or ($_POST['sidesOriginal'] !== $sideext)) {
echo "enter";
}
Ответы
Ответ 1
$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.
Смотрите Операторы массива.
ИЗМЕНИТЬ
Оператор неравенства !=
, а нетождественный оператор !==
соответствует равенству
оператор ==
и тождественный оператор ===
.
Ответ 2
В соответствии с эта страница.
ПРИМЕЧАНИЕ. Принятый ответ работает для ассоциативных массивов, но он не будет работать так, как ожидалось, с индексированными массивами (поясняется ниже). Если вы хотите сравнить любой из них, используйте это решение. Кроме того, эта функция может не работать с многомерными массивами (из-за характера функции array_diff).
Тестирование двух индексированных массивов, элементы которых находятся в другом порядке, с ошибками $a == $b
или $a === $b
, например:
<?php
(array("x","y") == array("y","x")) === false;
?>
Это потому, что это означает:
array(0 => "x", 1 => "y")
vs. 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), поскольку оно может улучшить скорость.
Ответ 3
Попробуйте выполнить сериализацию. Это также проверит вложенные подмассивы.
$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
Ответ 4
Сравните их как другие значения:
if($array_a == $array_b) {
//they are the same
}
Здесь вы можете прочитать обо всех операциях массива:
http://php.net/manual/en/language.operators.array.php
Обратите внимание, например, что ===
также проверяет, что типы и порядок элементов в массивах одинаковы.
Ответ 5
!===
не будет работать, потому что это синтаксическая ошибка. Правильный способ: !==
(не три символа "равно" )
Ответ 6
Вы можете использовать array_diff_assoc
, чтобы проверить различия между ними.
Ответ 7
Краткое решение, которое работает даже с массивами, ключи которых даны в другом порядке:
public static function arrays_are_equal($array1, $array2)
{
array_multisort($array1);
array_multisort($array2);
return ( serialize($array1) === serialize($array2) );
}
Ответ 8
Другой метод проверки равенства независимо от порядка значений работает с помощью 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;
}
Ответ 9
array_diff - вычисляет разницу в массивах
http://php.net/manual/en/function.array-diff.php
array array_diff ( array $array1 , array $array2 [, array $... ] )
Сравнивает array1
с одним или несколькими другими массивами и возвращает значения в array1
, которые не присутствуют ни в одном из других массивов.
Ответ 10
Один из способов: (реализация "считается равным" для 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 (e.g. "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));
}
Ответ 11
if (array_diff($a,$b) == array_diff($b,$a)) {
// Equals
}
if (array_diff($a,$b) != array_diff($b,$a)) {
// Not Equals
}
Из моего pov лучше использовать array_diff, чем array_intersect, потому что при проверках такого рода возвращаемые различия обычно меньше, чем сходства, поэтому преобразование bool требует меньше памяти.
Редактировать Обратите внимание, что это решение предназначено для простых массивов и дополняет приведенный выше раздел == и ===, который действителен только для словарей.
Ответ 12
Использовать функцию 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;
Ответ 13
Синтаксическая проблема на ваших массивах
$array1 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$array2 = array(
'a' => 'value1',
'b' => 'value2',
'c' => 'value3',
);
$diff = array_diff($array1, $array2);
var_dump($diff);
Ответ 14
Если вы хотите проверить неассоциативные массивы, вот решение:
$a = ['blog', 'company'];
$b = ['company', 'blog'];
(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals