Так вот что меня беспокоит.
У меня два массива:
$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? Есть ли более элегантный способ сделать это?
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);
$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 )
Рабочий пример здесь .