2014-01-15 5 views
25
[2,5,3]  

[5,2,3] 

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

+5

сортировка и проверка ... – user1844933

+0

массив_дифф() не является совершенным. сортировать и сравнивать с лучшими. –

+0

@ СурешКамруши Почему? – jeroen

ответ

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

Функция сортировки имеет побочный эффект при сортировке данных, поэтому, если вы хотите сохранить первоначальный заказ, вам нужно сделать копию его в $ a и $ b, прежде чем использовать это. – Ray

-1
$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."; 
} 
+7

Неправильно. Ваш пример кода не будет выполнен для $ array1 = array (2,5,3, 3); $ array2 = array (5,2,3); array_diff проверяет, какие значения находятся в обоих массивах, все равно, как часто они там находятся. –

+0

@ Matthias Huttar, это правильно. К сожалению, мне пришлось пройти трудный путь, чтобы обнаружить .. – Ionut

+0

Кроме того, 'array_diff'" сравнивает массив 1 с одним или несколькими другими массивами и возвращает значения в массиве1, которые не присутствуют ни в одном из других массивов ". Поэтому, если, например, '$ array2' имел более отличные значения, чем' $ array1', код в этом ответе ложно сообщал бы массивы как равные. Это точка, о которой упоминается в комментарии @SureshKamrushi в вопросе. – faintsignal

14

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

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

+1

Это не удастся, если есть столкновение в целых числах (это означает, что первое значение имеет -1, а второе имеет +1), вычисленное значение будет равно обеим массивам, но это разные массивы. – kindaian

6

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

Это решение не требует повторения элементов. например: [2,5,3] и [5,2,3,3] будут равны в соответствии с вышеуказанной логикой. – Rao

+0

привет, сэр, если $ array1 = array (2,5,3,1,9,8); $ array2 = array (5,2,3); то как он используется? –

5

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

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

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

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

+0

Я думаю, что это лучший ответ, принятый ответ оставляет побочный эффект фактически сортировки массивов $ a и $ b, которые вы, возможно, не захотите. – Ray

+0

Глядя немного глубже, это, кажется, не работает в каждом случае, так как array_diff сворачивает несколько результатов в один. Кажется, это проходит. $ a = ['red', 'red', 'blue', 'blue']; $ b = ['red', 'red', 'red', 'blue']; – Ray

+0

Это меня так грустно ... Мне нужно будет это проверить. Я действительно не хочу делать какие-либо сортировки, но я также не хочу бросать 'unique' на' $ a' и '$ b', чтобы сделать это ... –

Смежные вопросы