Проверьте, имеют ли два массива одинаковые значения

[2,5,3]    

[5,2,3]

Они равны, потому что они имеют одинаковые значения, но не в том же порядке. Могу ли я узнать, что без использования цикла foreach с in_array()? Я не думаю, что это будет эффективно.

Ответ 1

sort($a);
sort($b);
if ($a==$b) {//equal}

Ответ 2

Это немного поздно для вечеринки, но в надежде, что это будет полезно:

Если вы уверены, что массивы содержат только строки или оба содержат только целые числа, то array_count_values($a) == array_count_values($b) имеет лучшую временную сложность. Однако ответ пользователя1844933 более общий.

Ответ 3

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

$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )

Он также примерно в 5 раз быстрее, чем опция сортировки. Не то, чтобы это было особенно медленным, поэтому я бы сказал, что это больше о ваших личных предпочтениях и о том, что вы считаете более понятным. Лично я предпочитаю не сортировать.

Изменить: Спасибо Ray за то, что это работает только с массивами с уникальными значениями.

Ответ 4

Если вы не хотите сортировать массивы, а просто хотите проверить равенство, независимо от порядка значений, используйте 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';
}

Ответ 5

Лучшим способом будет использование array_diff http://php.net/manual/en/function.array-diff.php

$arr1 = [2,5,3];
$arr2 = [5,2,3];

$isEqual = array_diff($arr1,$arr2) === array_diff($arr2,$arr1);

Ответ 6

Поскольку ни один из приведенных ответов, полностью не зависящих от ключа, не работает с дублированными значениями (например, [1,1,2] равно [1,2,2]), я написал свой собственный.

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

function array_equals(array $either, array $other) : bool {
    $copy = $either;
    foreach ($other as $element) {
        $key = array_search($element, $copy, true);
        if ($key === false) {
            return false;
        }
        unset($copy[$key]);
    }
    return empty($copy);
}

Хотя вопрос был задан о варианте без foreach, я не мог найти решение, которое удовлетворяло бы моим требованиям без цикла. Кроме того, большинство других используемых функций также используют цикл внутри.

Ответ 7

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

const expectedFields = ['auth', 'message'];
const receivedFields = Object.keys(data);
const everyItemexists = expectedFields.map(i => receivedFields.indexOf(i) > -1);
const condition = everyItemexists.reduce((accumulator, item) => item && accumulator, true);

В принципе, пройдите один из массивов, здесь (я предполагаю, что они имеют одинаковый размер). Затем проверьте, существует ли его в другом массиве. Тогда я уменьшу результат этого.

Ответ 8

$array1 = array(2,5,3);
$array2 = array(5,2,3);
$result = array_diff($array1, $array2);
if(empty($result))
{
   echo "Both arrays are equal.";
}
else
{
   echo "Both arrays are different.";
}