PHP - проверить, равны ли два массива - PullRequest
233 голосов
/ 15 апреля 2011

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

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

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}

Ответы [ 13 ]

444 голосов
/ 15 апреля 2011
$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.

См. Операторы массива .

РЕДАКТИРОВАТЬ

Оператор неравенства !=, а оператор неидентификации !== для соответствия оператору равенства == и оператору тождества ===.

74 голосов
/ 03 августа 2011

Согласно этой странице .

ПРИМЕЧАНИЕ: Принятый ответ работает для ассоциативных массивов, но не работает должным образом с индексированными массивами (объяснено ниже),Если вы хотите сравнить любой из них, используйте это решение.Кроме того, эта функция может не работать с многомерными массивами (из-за природы функции array_diff).

Тестирование двух индексированных массивов, элементы которых находятся в разном порядке, например, с ошибками $a == $b или $a === $b:

<?php
    (array("x","y") == array("y","x")) === false;
?>

Это потому, что приведенное выше означает:

array(0 => "x", 1 => "y") против 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), так как это может улучшить скорость.

31 голосов
/ 15 июля 2011

Попробуйте сериализовать. Это также проверит вложенные подмассивы.

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";
9 голосов
/ 30 августа 2012

!=== не будет работать, потому что это синтаксическая ошибка.Правильный путь: !== (не три символа "равно")

9 голосов
/ 15 апреля 2011

Сравните их как другие значения:

if($array_a == $array_b) {
  //they are the same
}

Вы можете прочитать обо всех операторах массива здесь: http://php.net/manual/en/language.operators.array.php Обратите внимание, например, что === также проверяет, что типы и порядок элементовв массивах одинаковые.

6 голосов
/ 16 сентября 2016

Краткое решение, которое работает даже с массивами, ключи которых даны в другом порядке:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}
2 голосов
/ 27 сентября 2015

Другой метод проверки равенства независимо от порядка значений работает с использованием 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;
}
1 голос
/ 20 августа 2018
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 требует меньше памяти.

Редактировать Обратите внимание, что это решение предназначено для простых массивов и дополняет приведенный выше == и === тот, который действителен только для словарей.

1 голос
/ 09 июня 2014

В одну сторону: (реализация «считается равным» для 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));
}
1 голос
/ 15 апреля 2011

array_diff - вычисляет разницу массивов

http://php.net/manual/en/function.array-diff.php

array array_diff ( array $array1 , array $array2 [, array $... ] )

Сравнивает array1 с одним или несколькими другими массивами и возвращает значения в array1, которыене присутствуют ни в одном из других массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...