Предположим, мы имеем 2 ассоциативных массива:
<?php $array1 = array( 1 => 2, 2 => 1, ); $array2 = array( 2 => 1, 1 => 2, );
Они содержат одни и те же элементы, но в другом порядке. Я хотел написать функцию сравнения, которая даст true, только если:
Итак, я попробовал следующее:
if ($array1 == $array2) { print "equal\n"; }
Печать: ровная
print count(array_diff_assoc($array1, $array1));
Печать: 0
Затем я создал следующую функцию:
function compare(&$array1, &$array2) { $n1 = count($array1); $n2 = count($array2); if ($n1 == $n2) { $keys1 = array_keys($array1); $keys2 = array_keys($array2); for ($i = 0; $i < $n1; ++$i) { if ($keys1[$i] == $keys2[$i]) { if ($array1[$keys1[$i]] != $array2[$keys2[$i]]) { return false; } } else { return false; } } return true; } else { return false; } }
Это работает правильно, но это не сработает, когда мы хотим, чтобы это строгое сравнение применялось для вложенных массивов массивов из-за оператора !=
В этом случае:
if ($array1[$keys1[$i]] != $array2[$keys2[$i]]) { return false; }
Это можно исправить, используя рекурсивную функцию, переключение по типу данных. Но эта упрощенная версия была в порядке для меня.
Есть ли стандартное решение для такого типа сравнения?
Как описано в операторе массива , вы хотите использовать оператор равенства =.
if ($array1 === $array2) { echo "same key pairs and same element order\n"; }
вы можете попробовать это ниже. который возвращает true, если значение key => и будет в любом порядке, иначе возвращает false
$array1 = array( 1 => 2, 2 => 1); $array2 = array( 2 => 1, 1 => 2); var_dump(compareArray($array1,$array2)); function compareArray ($array1, $array2) { foreach ($array1 as $key => $value) { if ($array2[$key] != $value) { return false; } } return true; }