Я хотел бы проверить, равны ли два массива. Я имею в виду: одинаковый размер, одинаковая индексация, одинаковые значения. Как я могу это сделать?
Используя «!==», я ожидаю, что следующее выражение выведет совпадение или нет, если хотя бы один элемент в массиве(ах) отличается, но на самом деле это не так.
if (($_POST['atlOriginal'] !== $oldAtlPosition)
or ($_POST['atl'] !== $aext)
or ($_POST['sidesOriginal'] !== $oldSidePosition)
or ($_POST['sidesOriginal'] !== $sideext)) {
echo "совпадение";
}
Ответ 1
Согласно вашему вопросу.
ПРИМЕЧАНИЕ: Принятый вопрос работает для ассоциативных массивов, но он не будет работать так, как ожидается, с индексированными массивами (объясняется ниже). Также эта функция может не работать с многомерными массивами (из-за структуры функции 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)
);
}
?>
Ответ 2
Попробуйте выполнить сериализацию. Этот код также проверит вложенные подмассивы.
$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Массив был проверен";
Ответ 3Простое решение, которое работает даже с массивами, ключи которых заданы в разном порядке:
public static function arrays_are_equal($array1, $array2) {
array_multisort($array1);
array_multisort($array2);
return ( serialize($array1) === serialize($array2) );
}
Ответ 4
if (array_diff($a,$b) == array_diff($b,$a)) {
// проверка прошла
}
if (array_diff($a,$b) != array_diff($b,$a)) {
// проверка не прошла
}
С моей точки зрения, лучше использовать array_diff, чем array_intersect, потому что при проверках такого рода возвращаемые значения обычно имеют меньше различий, чем совпадений, и таким образом преобразование bool занимает меньше памяти. Обратите внимание, что это решение предназначено для простых массивов, и сравнения типа «==» и «===» могут быть применимы только для словарей.
Ответ 5
Другой метод проверки равенства независимо от порядка следования значений работает с помощью 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 'равенство';
} else {
echo 'неравенство';
}
Вот версия, которая работает также с многомерными массивами:
$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 'равенство';
} else {
echo 'неравенство';
}
function compare($v1, $v2) {
if ($v1===$v2) {
return 0;
}
if ($v1 > $v2) return 1;
return -1;
}
Ответ 6
Этот способ позволяет использовать ассоциативные массивы, члены которых упорядочены по-разному: например, они будут считаться равными во всех языках, кроме php :)
// рекурсивный ksort
function rksort($a) {
if (!is_array($a)) {
return $a;
}
foreach (array_keys($a) as $key) {
$a[$key] = ksort($a[$key]);
}
// SORT_STRING кажется необходимым, так как в противном случае
// числовые индексы (например, "0") не сортируются.
ksort($a, SORT_STRING);
return $a;
}
function considered_equal($a1, $a2) {
return json_encode(rksort($a1)) === json_encode(rksort($a2));
}
Web