Массив сравнения PHP

Есть ли все-таки, чтобы сравнить массивы в php с помощью встроенной функции, не выполняя какой-либо цикл?

$a1 = array(1,2,3); $a2 = array(1,2,3); if (array_are_same($a1, $a2)) { // code here } 

Btw, значения массива не всегда будут в одном порядке.

 if ( $a == $b ) { echo 'We are the same!' } 

Сравнение двух массивов с равными значениями (дублируемыми или нет, с учетом array_diff() ) может быть выполнено с помощью array_diff() в обоих направлениях:

 !array_diff($a, $b) && !array_diff($b, $a); 

Это дает TRUE если оба массива имеют одинаковые значения (после манипуляции с типом). FALSE противном случае. Примеры:

 function array_equal_values(array $a, array $b) { return !array_diff($a, $b) && !array_diff($b, $a); } array_equal_values([1], []); # FALSE array_equal_values([], [1]); # FALSE array_equal_values(['1'], [1]); # TRUE array_equal_values(['1'], [1, 1, '1']); # TRUE 

Как показано в этом примере, array_diff оставляет ключи массива из уравнения и не заботится о порядке значений и ни о том, что значения дублируются, либо нет.


Если дублирование должно иметь значение, это становится более сложным. Что касается «простых» значений (работают только строковые и целочисленные значения), то вступает в игру array_count_values() для сбора информации о том, какое значение часто находится внутри массива. Эта информация легко сравнивается с == :

 array_count_values($a) == array_count_values($b); 

Это дает TRUE если оба массива имеют одинаковые значения (после манипуляции с типом) за такое же количество времени. FALSE противном случае. Примеры:

 function array_equal_values(array $a, array $b) { return array_count_values($a) == array_count_values($b); } array_equal_values([2, 1], [1, 2]); # TRUE array_equal_values([2, 1, 2], [1, 2, 2]); # TRUE array_equal_values(['2', '2'], [2, '2.0']); # FALSE array_equal_values(['2.0', '2'], [2, '2.0']); # TRUE 

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


Эти примеры до сих пор частично ограничены строковыми и целочисленными значениями, и строгое сравнение с array_diff . Более строго для сравнения – array_search . Поэтому значения нужно подсчитывать и индексировать, чтобы их можно было сравнить, поскольку их просто превратить в ключ (как array_search делает array_search ) не будет.

Это немного больше работы. Однако в итоге сравнение такое же, как и раньше:

 $count($a) == $count($b); 

Это просто $count который делает разницу:

  $table = []; $count = function (array $array) use (&$table) { $exit = (bool)$table; $result = []; foreach ($array as $value) { $key = array_search($value, $table, true); if (FALSE !== $key) { if (!isset($result[$key])) { $result[$key] = 1; } else { $result[$key]++; } continue; } if ($exit) { break; } $key = count($table); $table[$key] = $value; $result[$key] = 1; } return $result; }; 

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

Эта функция также может добавить строгий контекст, добавив дополнительный параметр. И добавив еще один дополнительный параметр, вы можете позволить искать дубликаты или нет. Полный пример:

 function array_equal_values(array $a, array $b, $strict = FALSE, $allow_duplicate_values = TRUE) { $add = (int)!$allow_duplicate_values; if ($add and count($a) !== count($b)) { return FALSE; } $table = []; $count = function (array $array) use (&$table, $add, $strict) { $exit = (bool)$table; $result = []; foreach ($array as $value) { $key = array_search($value, $table, $strict); if (FALSE !== $key) { if (!isset($result[$key])) { $result[$key] = 1; } else { $result[$key] += $add; } continue; } if ($exit) { break; } $key = count($table); $table[$key] = $value; $result[$key] = 1; } return $result; }; return $count($a) == $count($b); } 

Примеры использования:

 array_equal_values(['2.0', '2', 2], ['2', '2.0', 2], TRUE); # TRUE array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE); # TRUE array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE, FALSE); # FALSE array_equal_values(['2'], ['2'], TRUE, FALSE); # TRUE array_equal_values([2], ['2', 2]); # TRUE array_equal_values([2], ['2', 2], FALSE); # TRUE array_equal_values([2], ['2', 2], FALSE, TRUE); # FALSE 

@Cleanshooter, извините, но это не делает, что ожидается todo: (так же упоминается в этом контексте array_diff)

 $a1 = array('one','two'); $a2 = array('one','two','three'); var_dump(count(array_diff($a1, $a2)) === 0); // returns TRUE 

(аннотация: вы не можете использовать пустые функции перед PHP 5.5 ), в этом случае результат верен, хотя массивы разные.

array_diff […] Возвращает массив, содержащий все записи из массива1, которые не присутствуют ни в одном из других массивов.

что не означает, что array_diff – это что-то вроде: array_get_all_differences . Объясняется в математических наборах, которые он вычисляет:

 {'one','two'} \ {'one','two','three'} = {} 

что означает что-то вроде всех элементов из первого набора без всех элементов из второго набора, которые находятся в первом наборе. Так что

 var_dump(array_diff($a2, $a1)); 

вычисляет

 array(1) { [2]=> string(5) "three" } 

Вывод состоит в том, что вы должны сделать array_diff в «обоих направлениях», чтобы получить все «отличия» от двух массивов.

надеюсь это поможет 🙂

Также вы можете попробовать:

 if(serialize($a1) == serialize($a2)) 

Просто проверьте $a1 == $a2 – что с этим не так?

array_intersect() возвращает массив, содержащий все общие значения.

Быстрый метод сравнения значений массива, который может быть в любом порядке …

 function arrays_are_same($array1, $array2) { sort($array1); sort($array2); return $array1==$array2; } 

Таким образом, для…

  $array1 = array('audio', 'video', 'image'); $array2 = array('video', 'image', 'audio'); 

arrays_are_same($array1, $array2) вернет TRUE

Вывод из комментария здесь:

Сравнение значений массива равным (после жонглирования типа) и только в том же порядке:

 array_values($a1) == array_values($a2) 

Сравнение значений массива равным (после жонглирования типа) и в том же порядке и в ключах массива совпадают и в том же порядке:

 array_values($a1) == array_values($a2) && array_keys($a1) == array_keys($a2) 

получить массив от пользователя или ввести значения массива. Используйте функцию сортировки для сортировки обоих массивов. проверьте с помощью тернарного оператора. Если оба массива равны, то они будут печатать массивы равными, иначе они будут печатать массивы, не равные. здесь нет итерации цикла.

 sort($a1); sort($a2); echo (($a1==$a2) ? "arrays are equal" : "arrays are not equal"); 

убедитесь, что количество пересечений совпадает с количеством исходных массивов

 $intersections = array_intersect($a1, $a2); $equality = (count($a1) == count($a2)) && (count($a2) == count($intersections)) ? true : false; 

Сравните значения двух массивов:

 $a = array(1,2,3); $b = array(1,3,2); if (array_diff($a, $b) || array_diff($b, $a)) { echo 'Not equal'; }else{ echo 'Equal'; } 

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

 $mag = '{"1":"1","2":"2","3":"3","4":"3"}'; $mag_evo = '1|2|3'; $test1 = array_values(json_decode($mag, true)); $test2 = array_values(explode('|', $mag_evo)); if($test1 == $test2) { echo 'true'; } 

Это не будет отражать истину, так как $ mag имеет 2 значения в массиве, равные 3.

Это лучше всего работает, если вы только заботитесь о значениях и ключах, и вам не нужно дублирование. $ mag = '{"1": "1", "2": "2", "3": "3", "4": "3"}'; $ mag_evo = '1 | 2 | 3';

 $test1 = json_decode($mag, true); $test2 = explode('|', $mag_evo); // There is no difference in either array. if(!array_diff($test1, $test2) && !array_diff($test2, $test1)) { echo 'true'; } 

Это вернет true, так как все значения будут найдены в обоих массивах, но, как отмечалось ранее, это не касается дублирования.

Если вы хотите найти некоторый массив внутри большого массива массивов (> 10k), то гораздо быстрее сравнивает сериализованные массивы (сохраненные в кеше). Пример из работы с URL:

 /** @return array */ function createCache() { $cache = []; foreach ($this->listOfUrl() as $url => $args) { ksort($args); $cache['url'][$url] = $args; $cache['arr'][crc32(serialize($args))] = $url; } return $cache; } /** @param array $args @return string */ function searchUrl($args) { ksort($params); $crc = crc32(serialize($params)); return isset($this->cache['arr'][$crc]) ? $this->cache['arr'][$crc] : NULL; } /** @param string $url @return array */ function searchArgs($url) { return isset($this->cache['url'][$url]) ? $this->cache['url'][$url] : NULL; } 

попробуй это :

 $array1 = array("street" => array("Althan"), "city" => "surat", "state" => "guj", "county" => "india"); $array2 = array("street" => array("Althan"), "city" => "surat", "state" => "guj", "county" => "india"); if (array_compare($array1, $array2)) { echo "<pre>"; print_r("succsses..!"); echo "</pre>"; exit; } else { echo "<pre>"; print_r("Faild..!"); echo "</pre>"; exit; } function array_compare($op1, $op2) { foreach ($op1 as $key => $val) { if (is_array($val)) { if (array_compare($val, $op2[$key]) === FALSE) return false; } else { if (!array_key_exists($key, $op2)) { return false; // uncomparable } elseif ($val < $op2[$key]) { return false; } elseif ($val > $op2[$key]) { return false; } } } return true; // $op1 == $op2 } 

Насколько я могу судить, нет никакой встроенной функции, которая сделает это для вас, однако, что-то вроде:

 if (count($a) == count($b) && (!count(array_diff($a, $b))) { // The arrays are the same } 

Должен сделать трюк

 if(count($a1) == count($a2)){ $result= array_intersect($a1, $a2); if(count($a1) == count($result)) echo 'the same'; else echo 'a1 different than a2'; } else echo 'a1 different than a2';