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

Array_diff() с многомерными массивами

Используя array_diff(), я могу сравнивать и удалять похожие элементы, но что, если у меня есть следующие массивы?

Array1

Array
(
    [0] => Array
        (
            [ITEM] => 1
        )

    [1] => Array
        (
            [ITEM] => 2
        )

    [2] => Array
        (
            [ITEM] => 3
        )
)

array2

Array
(
    [0] => Array
        (
            [ITEM] => 2
        )

    [1] => Array
        (
            [ITEM] => 3
        )

    [2] => Array
        (
            [ITEM] => 1
        )
    [3] => Array
        (
            [ITEM] => 4
        )
)

Я хочу отфильтровать похожие элементы; результат должен вернуться 4. Как я могу изменить порядок массива, чтобы использовать array_diff()?

4b9b3361

Ответ 1

Я бы, вероятно, перебирал исходные массивы и делал их одномерными... что-то вроде

foreach($array1 as $aV){
    $aTmp1[] = $aV['ITEM'];
}

foreach($array2 as $aV){
    $aTmp2[] = $aV['ITEM'];
}

$new_array = array_diff($aTmp1,$aTmp2);

Ответ 2

Вы можете определить пользовательскую функцию сравнения, используя array_udiff().

function udiffCompare($a, $b)
{
    return $a['ITEM'] - $b['ITEM'];
}

$arrdiff = array_udiff($arr2, $arr1, 'udiffCompare');
print_r($arrdiff);

Вывод:

Array
(
    [3] => Array
        (
            [ITEM] => 4
        )
)

Это использует и сохраняет существующую структуру массивов, которую я предполагаю, что вы хотите.

Ответ 3

Еще один забавный подход с трюком json_encode (может быть полезным, если вам нужно "сырое" сравнить некоторые сложные значения в массиве первого уровня):

// Compare all values by a json_encode
$diff = array_diff(array_map('json_encode', $array1), array_map('json_encode', $array2));

// Json decode the result
$diff = array_map('json_decode', $diff);

Ответ 4

Несколько решений, использующих array_filter, которые менее эффективны, чем array_udiff решение для больших массивов, но которые немного более просты и гибки:

$array1 = [
    ['ITEM' => 1],
    ['ITEM' => 2],
    ['ITEM' => 3],
];

$array2 = [
    ['ITEM' => 2],
    ['ITEM' => 3],
    ['ITEM' => 1],
    ['ITEM' => 4],
];

$arrayDiff = array_filter($array2, function ($element) use ($array1) {
    return !in_array($element, $array1);
});

// OR

$arrayDiff = array_filter($array2, function ($array2Element) use ($array1) {
    foreach ($array1 as $array1Element) {
        if ($array1Element['ITEM'] == $array2Element['ITEM']) {
            return false;
        }
    }
    return true;
});

Как всегда с array_filter, обратите внимание, что array_filter сохраняет ключи исходного массива, поэтому, если вы хотите, чтобы $arrayDiff был нулевым индексом, выполните $arrayDiff = array_values($arrayDiff); после вызова array_filter.

Ответ 5

Вы можете использовать приведенный ниже код, чтобы получить разницу

$a1 = Array(
    [0] => Array(
            [ITEM] => 1
        )
    [1] => Array(
            [ITEM] => 2
        )
    [2] => Array(
            [ITEM] => 3
        )
    );

$a2 = Array(
    [0] => Array(
            [ITEM] => 2
        )
    [1] => Array(
            [ITEM] => 3
        )

    [2] => Array(
            [ITEM] => 1
        )
    [3] => Array(
            [ITEM] => 4
        ));

array_diff(array_column($a1, 'ITEM'), array_column($a2, 'ITEM'));

Ответ 6

Возникла та же проблема, но мой многомерный массив имеет различные ключи, в отличие от вашего "ПУНКТА", последовательно в каждом массиве.

Решил это с помощью: $result = array_diff_assoc($array2, $array1);

Ссылка: PHP: array_diff_assoc

Ответ 7

Сравнивает массив1 с одним или несколькими другими массивами и возвращает значения в массиве1, которых нет ни в одном из других массивов.

        //Enter your code here, enjoy!

$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);