php 筛选3d数组中特定列中的键满足平面白名单数组的行

omhiaaxx  于 2023-03-28  发布在  PHP
关注(0)|答案(1)|浏览(129)

我需要过滤一个三维数组的关键字在其列之一。我希望保留任何行,其中包含所有必需的关键字从一个声明的白名单数组。
样本数据:

[
    [
        'name' => 'Фізика',
        'disciplines' => [
            1 => 'Українська мова та література',
            4 => 'Математика',
            5 => 'Фізика',
            6 => 'Біологія',
        ],
        'priority' => [
            1 => 0,
            4 => 1,
            5 => 2,
            6 => 2,
        ]
    ],
    [
        'name' => 'Інформатика',
        'disciplines' => [
            1 => 'Українська мова та література',
            2 => 'Історія України',
            4 => 'Математика',
            12 => 'Іноземна мова',
        ],
        'priority' => [
            1 => 0,
            2 => 2,
            4 => 1,
            12 => 2,
        ]
    ],
    [
        'name' => 'Початкова освіта',
        'disciplines' => [
            1 => 'Українська мова та література',
            2 => 'Історія України',
        ],
        'priority' => [
            1 => 0,
            2 => 2,
        ]
    ],
]

我希望保留那些规程数组包含平面数组中所有值的键的行:

[2, 4, 12]

in_array()对我不起作用。我如何使用这个必需键的数组来过滤这个数组结构?从我的示例数据来看,只应该保留第二行。
var_dump() of larger array

6yt4nkrj

6yt4nkrj1#

  • 准备白名单,使所需的值是平面数组的键。
  • 调用array_filter()迭代样本数组的每一行。
  • 尝试使用行的纪律键从白名单数组中删除尽可能多的元素。如果没有剩余的元素,则该行满足白名单,应该保留。

代码:(Demo

$get['disciplines'] = ['second' => 2, 'third' => 4, 'fourth' => 12];
$filterBy = array_flip($get['disciplines']);

var_export(
    array_filter(
        $array,
        fn($row) => !array_diff_key($filterBy, $row['disciplines'])
    )
);

相关问题