PHP: встроенная функция для проверки того, равны ли два значения массива (игнорирование порядка)

Есть ли встроенная функция для PHP, чтобы проверить, содержат ли два массива одинаковые значения (порядок не важен?).

Например, мне нужна функция, которая возвращает true для следующих двух входов:

array('4','5','2') 
array('2','4','5')

Изменить: я мог бы отсортировать два массива и сравнить их, но поскольку я такой ленивый парень, я бы предпочел один лайнер, который я могу вытащить и использовать.

Ответы

Ответ 1

array_diff выглядит как опция:

function array_equal($a1, $a2) {
  return !array_diff($a1, $a2) && !array_diff($a2, $a1);
}

или как oneliner в вашем коде:

if(!array_diff($a1, $a2) && !array_diff($a2, $a1)) doSomething();

Ответ 2

Лучшим решением является сортировка обоих массивов, а затем их сравнение:

$a = array('4','5','2');
$b = array('2','4','5');
sort($a);
sort($b);
var_dump($a === $b);

Как функция:

function array_equal($a, $b, $strict=false) {
    if (count($a) !== count($b)) {
        return false;
    }
    sort($a);
    sort($b);
    return ($strict && $a === $b) || $a == $b;
}

Вот еще один алгоритм, который ищет каждый элемент A, если его в B:

function array_equal($a, $b, $strict=false) {
    if (count($a) !== count($b)) {
        return false;
    }
    foreach ($a as $val) {
        $key = array_search($val, $b, $strict);
        if ($key === false) {
            return false;
        }
        unset($b[$key]);
    }
    return true;
}

Но это имеет сложность O (n ^ 2). Поэтому вам лучше использовать метод сортировки.

Ответ 3

Метод array_diff() выше не будет работать.

Руководство php.net говорит, что array_diff() делает это:

"Возвращает массив, содержащий все записи из массива1, которые не присутствуют ни в одном из других массивов."

Таким образом, фактический метод array_diff():

function array_equal($array1, $array2)
{
   $diff1 = array_diff($array1, $array2);
   $diff2 = array_diff($array2, $array1);

   return
   (
      (count($diff1) === 0) &&
      (count($diff2) === 0)
   );
}

Однако я иду с методом сортировки: D

Ответ 4

Вы можете использовать array_diff.

$a = array('4','5','2');
$b = array('2','4','5');

if(count(array_diff($a, $b)) == 0) {
  // arrays contain the same elements
} else {
  // arrays contain different elements
}

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

Ответ 5

Вам нужно сравнить только одностороннее использование array_diff() и использовать count() для перевернутых отношений.

if (count($a1) == count($a2) && !array_diff($a1, $a2)) {
    // equal arrays
}

Ответ 6

Вы можете использовать array_intersect() вместо array_diff():

$a = array('4','5','2');
$b = array('2','4','5');
$ca = count($a);
$cb = count($b);
$array_equal = ( $ca == $cb && $ca == count(array_intersect($a, $b)) );

Производительность. решение, где важны два фактора:

  • Чем чаще массивы сопоставляются, тем больше array_intersect() выполняется быстро.
  • Чем больше массивов являются большими (более 10 значений), тем больше array_intersect() выполняется быстро.

В зависимости от этих факторов один метод может быть на два или три раза быстрее, чем другой. Для больших массивов с небольшими (или нет) комбинациями соответствия или для небольших массивов с большим количеством совпадений оба метода эквивалентны.

Однако метод сортировки всегда быстрее, за исключением случая с небольшими массивами с несколькими комбинациями совпадений или без них. В этом случае метод array_diff() на 30% быстрее.

Ответ 7

Если сравниваемые массивы состоят только из строк и/или целых чисел, array_count_values позволяет сравнить массивы быстро (в O(n) время vs O(n log n) для сортировки), проверяя, что оба массива содержат одни и те же значения, и каждое значение имеет одно и то же число раз в обоих массивах.

if(array_count_values($a1) == array_count_values($a2)) {
    //arrays are equal
}