通过 2d 黑名单数组中的行过滤 3d 数组中的行集

问题描述 投票:0回答:2

我有一个 3d 数组

$result
:

[
    [
        ['itemid' => 1, 'name' => 'A'],
        ['itemid' => 2, 'name' => 'B'],
    ],
    [
        ['itemid' => 3, 'name' => 'C'],
        ['itemid' => 4, 'name' => 'D'],
    ],
]

和一个二维数组

$items
:

[
    ['itemid' => 2, 'name' => 'B'],
    ['itemid' => 4, 'name' => 'D'],
]

如何从

$result
数组中的每个集合中删除
$items
数组中出现的行?在这种情况下,
$result
将变为:

[
    [
        ['itemid' => 1, 'name' => 'A'],
    ],
    [
        ['itemid' => 3, 'name' => 'C'],
    ],
]

由于问题主要是代码,因此这里有一些额外的字符以使 StackOverflow 接受问题。

php arrays multidimensional-array filtering blacklist
2个回答
1
投票

我想这就是你想要的。 (尚未测试)

<?php
foreach ($result as $key => $array) {
    $result[$key] = array_diff($array, $items);
}

print_r($result);

0
投票

循环 3D 输入数组中的数据集,并利用白名单对每组数据进行

array_udiff()
的过滤调用。

代码:(演示

$array = [
    [
        ['itemid' => 1, 'name' => 'A'],
        ['itemid' => 2, 'name' => 'B'],
    ],
    [
        ['itemid' => 3, 'name' => 'C'],
        ['itemid' => 4, 'name' => 'D'],
    ],
];

$whitelist = [
    ['itemid' => 2, 'name' => 'B'],
    ['itemid' => 4, 'name' => 'D'],
];

var_export(
    array_map(
        fn($set) => array_udiff(
            $set,
            $whitelist,
            fn($a, $b) => $a <=> $b
        ),
        $array
    )
);

输出:

array (
  0 => 
  array (
    0 => 
    array (
      'itemid' => 1,
      'name' => 'A',
    ),
  ),
  1 => 
  array (
    0 => 
    array (
      'itemid' => 3,
      'name' => 'C',
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.