PHP – Как сравнить два массива и удалить повторяющиеся значения

Так вот что меня беспокоит.

У меня два массива:

$array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); $array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 

Теперь я хочу сравнить эти два массива и удалить все повторяющиеся значения.
В конце я хочу, чтобы эти два массива, но без «демо» и «некоторые» значения в них.
Я хочу удалить все значения из массива, имеющие один и тот же ключ и значение индекса.
У массива всегда будет одинаковое количество значений и индексов, я хочу только сравнить их и удалить записи, имеющие один и тот же индексный ключ и значение, из обоих.

Сейчас я делаю что-то вроде этого:

 $clean1 = array(); $clean2 = array(); foreach($array1 as $key => $value) { if($value !== $array2[$key]) { $clean1[$key] = $value; $clean2[$key] = $array2[$key]; } } var_export($clean1); echo "<br />"; var_export($clean2); 

И это работает! Но им интересно, есть ли другой способ сделать это? Может быть, без использования цикла foreach? Есть ли более элегантный способ сделать это?

Related of "PHP – Как сравнить два массива и удалить повторяющиеся значения"

 array_unique( array_merge($arr_1, $arr_2) ); 

или вы можете сделать:

 $arr_1 = array_diff($arr_1, $arr_2); $arr_2 = array_diff($arr_2, $arr_1); 

Я полагаю…

Вы можете использовать функцию array_diff в PHP, которая будет возвращаться, и массив, содержащий ключи, которые являются одинаковыми между двумя массивами.

 $clean1 = array_diff($array1, $array2); 

http://php.net/manual/en/function.array-diff.php

 $clean1 = array_diff($array1, $array2); $clean2 = array_diff($array2, $array1); $final_output = array_merge($clean1, $clean2); 

Поскольку $array1 и $array2 всегда имеют одинаковую длину, вы можете сделать что-то вроде этого:

 <?php $array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); $array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); $map = array_combine($array1,$array2); $map = array_filter($map ,function ($item) use (&$map) { $keep_data = ($item != key($map)); next($map); return $keep_data; }); $clean1 = array_keys($map); $clean2 = array_values($map); var_export($clean1); echo "<br />"; var_export($clean2); ?> 

Это лучше? Вам решать

как насчет?

 $res = array_diff($array1, $array_intersect($array1, $array2)); $reindexed = array_combine(array_keys($res), array_values($res)); 

или просто, если ключи не нужны

 array_values(array_diff($array1, $array_intersect($array1, $array2))); 

Ваше решение, безусловно, является самым «изящным» (что означает самый легкий для чтения и наименьший объем кода), но вот еще одно решение, которое использует array_diff_ukey () . Он сохраняет ключи и ставит их в порядке возрастания, как вы просили.

 $array1 = ['[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]']; $array2 = ['value1' ,'demo' ,'value2' ,'some' ,'value3']; $clean1 = $array1; $clean2 = array_diff_ukey( $array2, $array1, // Need to have "&" so the values get set. function($a, $b) use (&$clean1, $array1, $array2) { // Use isset() just in case keys are not identical // or arrays are not the same length. if (isset($array2[$b]) && $array2[$b] === $array1[$b]) { unset($clean1[$b]); } return strcmp($array2[$a], $array1[$b]); }); print_r($clean1); print_r($clean2); с $array1 = ['[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]']; $array2 = ['value1' ,'demo' ,'value2' ,'some' ,'value3']; $clean1 = $array1; $clean2 = array_diff_ukey( $array2, $array1, // Need to have "&" so the values get set. function($a, $b) use (&$clean1, $array1, $array2) { // Use isset() just in case keys are not identical // or arrays are not the same length. if (isset($array2[$b]) && $array2[$b] === $array1[$b]) { unset($clean1[$b]); } return strcmp($array2[$a], $array1[$b]); }); print_r($clean1); print_r($clean2); 

Вернет это:

 Array ( [0] => [param1] [2] => [param2] [4] => [param3] ) Array ( [0] => value1 [2] => value2 [4] => value3 ) 

Рабочий пример здесь .