[2,5,3]
[5,2,3]
Они равны, потому что они имеют одинаковые значения, но не в том же порядке. Могу ли я узнать, что без использования цикла foreach с in_array()? Я не думаю, что это будет эффективно.
[2,5,3]
[5,2,3]
Они равны, потому что они имеют одинаковые значения, но не в том же порядке. Могу ли я узнать, что без использования цикла foreach с in_array()? Я не думаю, что это будет эффективно.
sort($a);
sort($b);
if ($a==$b) {//equal}
Это немного поздно для вечеринки, но в надежде, что это будет полезно:
Если вы уверены, что массивы содержат только строки или оба содержат только целые числа, то array_count_values($a) == array_count_values($b)
имеет лучшую временную сложность. Однако ответ пользователя1844933 более общий.
Прибытие на эту вечеринку поздно. У меня был тот же вопрос, но я не хотел сортировать, что было прямым ответом, который, как я знал, будет работать. Я придумал этот простой однострочный , который работает только для массивов уникальных значений:
$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )
Он также примерно в 5 раз быстрее, чем опция сортировки. Не то, чтобы это было особенно медленным, поэтому я бы сказал, что это больше о ваших личных предпочтениях и о том, что вы считаете более понятным. Лично я предпочитаю не сортировать.
Изменить: Спасибо Ray за то, что это работает только с массивами с уникальными значениями.
Если вы не хотите сортировать массивы, а просто хотите проверить равенство, независимо от порядка значений, используйте 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';
}
Лучшим способом будет использование 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);
Поскольку ни один из приведенных ответов, полностью не зависящих от ключа, не работает с дублированными значениями (например, [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, я не мог найти решение, которое удовлетворяло бы моим требованиям без цикла. Кроме того, большинство других используемых функций также используют цикл внутри.
Я столкнулся с этой проблемой и решил ее таким образом: мне нужно было убедиться, что два объекта имеют одинаковые поля.
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);
В принципе, пройдите один из массивов, здесь (я предполагаю, что они имеют одинаковый размер). Затем проверьте, существует ли его в другом массиве. Тогда я уменьшу результат этого.
$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.";
}