Web

Проверка равенства двух массивов в PHP

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

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

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

Лучшие бесплатные платформы для создания сайтов без особых навыков

Web

Как вывести данные из DataBase, скопировать все вводимые данные из формы, чтобы отправить их себе, включая произведение веса*шт в режиме реального времени

Web

Как создать сервер веб-сокетов на PHP

Web

Как проверить, является ли массив PHP ассоциативным или последовательным

×