Подтвердить что ты не робот

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? Есть ли более элегантный способ сделать это?

4b9b3361

Ответ 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);

Я думаю...

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Так как $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);

?>

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

Ответ 5

как насчет?

$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)));

Ответ 6

Ваше решение, безусловно, является самым "изящным" (что означает, что проще всего читать и наименьшее количество кода), но вот еще одно решение, которое использует 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
)

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