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

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

Web

Что лучше использовать define() или const?

Web

Ajax. Загрузка изображения

Node.js — определение, возможности, события и задержка
Web

Node.js — определение, возможности, события и задержка

×