Ответ 1
array_unique( array_merge($arr_1, $arr_2) );
или вы можете сделать:
$arr_1 = array_diff($arr_1, $arr_2);
$arr_2 = array_diff($arr_2, $arr_1);
Я думаю...
Так вот что меня беспокоит.
У меня есть два массива:
$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);
Вернет это:
Array
(
[0] => [param1]
[2] => [param2]
[4] => [param3]
)
Array
(
[0] => value1
[2] => value2
[4] => value3
)
Рабочий пример здесь.