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));

}

 

Схожие статьи

Pastebin PoE: что это такое и как пользоваться этим приложением
Web

Pastebin PoE: что это такое и как пользоваться этим приложением

Как бесплатно проверить доступность сайта из разных частей мира?
Web

Как бесплатно проверить доступность сайта из разных частей мира?

Как создать грамотное оформление страницы 404 на собственном сайте
Web

Как создать грамотное оформление страницы 404 на собственном сайте

Web

Может ли PHP, используя cURL, получить заголовки и тело ответа за один запрос