Сравните два ассоциативных массива относительно порядка ключей

Предположим, мы имеем 2 ассоциативных массива:

<?php $array1 = array( 1 => 2, 2 => 1, ); $array2 = array( 2 => 1, 1 => 2, ); 

Они содержат одни и те же элементы, но в другом порядке. Я хотел написать функцию сравнения, которая даст true, только если:

  1. Массивы имеют одинаковые пары ключей => значение.
  2. Порядок пар одинаковый.

Итак, я попробовал следующее:

1 попытка

 if ($array1 == $array2) { print "equal\n"; } 

Печать: ровная

Попробуйте 2

 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; } 

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

Есть ли стандартное решение для такого типа сравнения?

Solutions Collecting From Web of "Сравните два ассоциативных массива относительно порядка ключей"

Как описано в операторе массива , вы хотите использовать оператор равенства =.

 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; }