Использование array_intersect в многомерном массиве - PullRequest
24 голосов
/ 13 апреля 2011

У меня есть два массива, которые выглядят так:

Array
(
    [0] => Array
        (
            [name] => STRING
            [value] => STRING
        )

    [1] => Array
        (
            [name] => STRING
            [value] => STRING
        )

    [2] => Array
        (
            [name] => STRING
            [value] => STRING
        )
)

, и я хотел бы иметь возможность реплицировать array_intersect путем сравнения идентификаторов подмассивов в двух основных массивах.До сих пор я не преуспел в моих попытках.(

Ответы [ 3 ]

43 голосов
/ 13 апреля 2011

Используйте array_uintersect() для использования пользовательской функции сравнения, например:

$arr1 = array(
           array('name' => 'asdfjkl;', 'value' => 'foo'),
           array('name' => 'qwerty', 'value' => 'bar'),
           array('name' => 'uiop', 'value' => 'baz'),
        );

$arr2 = array(
           array('name' => 'zxcv', 'value' => 'stuff'),
           array('name' => 'asdfjkl;', 'value' => 'foo'),
           array('name' => '12345', 'value' => 'junk'),
           array('name' => 'uiop', 'value' => 'baz'),
        );

$intersect = array_uintersect($arr1, $arr2, 'compareDeepValue');
print_r($intersect);

function compareDeepValue($val1, $val2)
{
   return strcmp($val1['value'], $val2['value']);
}

что дает, как вы надеетесь:

Array
(
    [0] => Array
        (
            [name] => asdfjkl;
            [value] => foo
        )

    [2] => Array
        (
            [name] => uiop
            [value] => baz
        )

)
4 голосов
/ 21 декабря 2015
function compareDeepValue($val1, $val2)
{
   return strcmp($val1['value'], $val2['value']);
}

Убедитесь, что ключ val2 существует в массиве val1, потому что функция сначала упорядочивает массив. Очень странно.

0 голосов
/ 08 мая 2019

Вы можете использовать встроенную функцию с функцией array_uintersect php. например:

$intersectNames = array_uintersect($arr1, $arr2, function ($val1, $val2){
    return strcmp($val1['name'], $val2['name']);
    });

$intersectValues = array_uintersect($arr1, $arr2, function ($val1, $val2){
    return strcmp($val1['value'], $val2['value']);
    });

print_r('namesIntersected' => $intersectNames, 'valuesIntersected' => $intersectValues)
...