У меня есть 2 массива, которые я пытаюсь получить уникальные значения только от них. Поэтому я не просто пытаюсь удалить дубликаты, я на самом деле пытаюсь удалить оба дубликата.
Поэтому, если я получаю 2 массива, например:
$array1 = array(); $array2 = array(); foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25; $array1[] = $value1; } foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150; $array2[] = $value2; }
Конечный результат, который я ищу, – это
$output = 20, 25, 100, 150;
Какой-нибудь опрятный способ сделать это?
Другие ответы на правильном пути, но array_diff
работает только в одном направлении – т.е. он возвращает значения, которые существуют в первом массиве, который не содержится ни в одном другом.
То, что вы хотите сделать, – это различие в обоих направлениях, а затем объединить различия:
$array1 = array(10, 15, 20, 25); $array2 = array(10, 15, 100, 150); $output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1)); // $output will be (20, 25, 100, 150);
Не умалять ответа Даниэля Вандерслуиса, но добавить к нему …
То, что вы ищете, это в основном операция XOR массивов. С этой целью «merlinyoda at dorproject dot net» предоставил следующую процедуру в комментарии по http://php.net/manual/en/function.array-diff.php :
<?php function array_xor ($array_a, $array_b) { $union_array = array_merge($array_a, $array_b); $intersect_array = array_intersect($array_a, $array_b); return array_diff($union_array, $intersect_array) } ?>
Эта функция использует другой подход к вычислению XOR.
Вот код для этого. Он может быть оптимизирован, но вы получаете идею:
$array1 = array(10, 15, 20, 25); $array2 = array(10, 15, 100, 150); $new_array = array(); foreach($array1 as $value) { if(!in_array($value, $array2)) { array_push($new_array, $value); } } foreach($array2 as $value) { if(!in_array($value, $array1)) { array_push($new_array, $value); } } print_r($new_array);
Чтобы использовать array_diff, вам нужно будет:
$array1 = array(10, 15, 20, 25); $array2 = array(10, 15, 100, 150); $out1 = array_diff($array1, $array2); $out2 = array_diff($array2, $array1); $output = array_merge($out1, $out2); print_r($output);
Другим хорошим решением является следующее:
$ array1 = array (10, 15, 20, 25);
$ array2 = массив (10, 15, 100, 150);
$ output = array_diff (array_merge ($ array1, $ array2), array_intersect ($ array1, $ array2));
// $ output будет (20, 25, 100, 150);
Функция array_diff()
( manual ) может использоваться для определения разницы между двумя массивами:
$array1 = array(10, 20, 40, 80); $array2 = array(10, 20, 100, 200); $diff = array_diff($array1, $array2); // $diff = array(40, 80, 100, 200);
Вы можете передать столько массивов, сколько хотите, но не ограничиваются двумя массивами.
см. array_diff ()
$output = array_diff($array1, $array2);