If array exists in array - 多维关联数组

If array exists in array - multidimensional associative array

我有两个多维数组。我想检查数组 1 中的每个项目,看看它是否在数组 2 中,反之亦然。

例如:

$arr1 = [
    [
        id => '1',
        order => '123238'
    ],
    [
        id => '2',
        order => '33278'
    ],
    [
        id => '3',
        order => '8892372'
    ]
];

$arr2 = [
    [
        id => '1',
        order => '349483'
    ],
    [
        id => '2',
        order => '9837283'
    ],
    [
        id => '3',
        order => '33278'
    ]
];

我想通过 order 查看。

所以像这样:

if($arr1['order'] does not exist in $arr2['order']) {
    echo 'abc';
}

if($arr2['order'] does not exist in $arr1['order']) {
    echo 'xyz';
}

我考虑过对两者进行 foreach 循环,但它不会让我知道 arr # 它从中丢失了。

我怎样才能做到这一点?

您可以使用 array_uintersect or array_udiff 根据 order 键的值查找每个数组中相同或不同的值:

// values in both $arr1 and $arr2
print_r(array_uintersect($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));
// values in $arr1 but not $arr2
print_r(array_udiff($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));
// values in $arr2 but not $arr1
print_r(array_udiff($arr1, $arr2, function ($a, $b) { return $a['order'] - $b['order']; }));

输出:

Array
(
    [1] => Array
        (
            [id] => 2
            [order] => 33278
        )

)

Array
(
    [0] => Array
        (
            [id] => 1
            [order] => 123238
        )
    [2] => Array
        (
            [id] => 3
            [order] => 8892372
        )
)

Array
(
    [0] => Array
        (
            [id] => 1
            [order] => 123238
        )
    [2] => Array
        (
            [id] => 3
            [order] => 8892372
        )
)

Demo on 3v4l.org

尝试这样的事情:

for ($i = 0; $i < 3; $i++) {
      for ($j = 0; $j < 3; $j++) {
            if (!in_array($arr1[$i]['order'], $arr2[$j])) {
                  echo "abc ";
            }
      }
}

它主要检查 arr1 中的每个 order 是否已经存在于 $arr2 中,如果不存在,您将得到一个 abc 作为输出。

因此你会得到这个作为输出:

abc abc abc abc abc abc abc abc abc



这里还有一个带有 foreach:

的版本
foreach ($arr1 as $arrone){
      foreach ($arr2 as $arrtwo) {
            if (!in_array($arrone['order'], $arrtwo)) {
                  echo "abc ";
            }
      }
}

您可以使用 array_columnarray_intersect_key

这样的方法
 $arr1 = array_column($arr1, null , 'order');
 $arr2 = array_column($arr2, null , 'order');
 print_r(array_intersect_key($arr1,$arr2));

示例:- https://3v4l.org/Imbao

您可以使用 array_uintersect 和自定义回调函数来检查值或 order 来获取所有交叉点。

$intersect = array_uintersect($arr1, $arr2, function ($a, $b) {
    return strcmp($a['order'], $b['order']);
});

print_r($intersect);

$notInArr1 = array_uintersect($arr1, $arr2, function ($a, $b) {
    if ($a["order"] === $b["order"]) return -1;
    if ($a["order"] > $b["order"]) return 1;
    return 0;
});

print_r($notInArr1);

$notInArr2 = array_uintersect($arr2, $arr1, function ($a, $b) {
    if ($a["order"] === $b["order"]) return -1;
    if ($a["order"] > $b["order"]) return 1;
    return 0;
});

print_r($notInArr2);

php demo

输出

Array
(
    [1] => Array
        (
            [id] => 2
            [order] => 33278
        )

)
Array
(
    [0] => Array
        (
            [id] => 1
            [order] => 123238
        )

    [2] => Array
        (
            [id] => 3
            [order] => 8892372
        )

)
Array
(
    [0] => Array
        (
            [id] => 1
            [order] => 349483
        )

    [1] => Array
        (
            [id] => 2
            [order] => 9837283
        )

)

忽略您的 ID,从您的第二个数组构建一个订单号列表,然后遍历您的初始数组以检查订单号是否不包含在:

数据:

$arr1 = [
    [
        id => '1',
        order => '123238'
    ],
    [
        id => '2',
        order => '33278'
    ],
    [
        id => '3',
        order => '8892372'
    ]
];

$arr2 = [
    [
        id => '1',
        order => '349483'
    ],
    [
        id => '2',
        order => '9837283'
    ],
    [
        id => '3',
        order => '33278'
    ]
];

方法:

foreach($arr2 as $item)
    $orders2[] = $item['order'];

foreach($arr1 as $item)
    if(!in_array($item['order'], $orders2))
        echo $item['order'], " order number is not contained\n";

输出:

123238 order number is not contained
8892372 order number is not contained