php 根据最深级别中的列值筛选具有四个级别的数组的行

vptzau2j  于 2023-03-28  发布在  PHP
关注(0)|答案(3)|浏览(144)

我有一个看起来像下面这样的数组,我从API接收它,因此无法更改它:

[
    [
        'id' => '123',
        'title' => 'Test',
        'categories' => [
            [
                'id' => 1
            ]
        ]
    ],
    [
        'id' => '456',
        'title' => 'Test',
        'categories' => [
            [
                'id' => 2
            ]
        ]
    ]
]

我只想得到包含'categories' => [ 'id' => 1 ]的完整数组
我试过这样的方法:

$filteredArray = array_filter($array, function ($value) {
    return ($value['categories'] === 1);
});

这将导致一个空数组。我如何实现这一点?

inb24sb2

inb24sb21#

这就可以了。你需要确保你一直走到最深的层次进行过滤。
不是最干净的解决方案(可能有更好的解决方案),但它有效:
Here is the sandbox for testing

$array = [
    [
        'id' => '123',
        'title' => 'Test',
        'categories' => [
            [
                'id' => 1
            ]
        ]
    ],
    [
        'id' => '456',
        'title' => 'Test',
        'categories' => [
            [
                'id' => 2
            ]
        ]
    ]
];

$filteredArray = array_filter($array, function ($value) {
    return array_filter($value['categories'], function($categories) { 
        return $categories['id'] === 1; 
    });
});

// Or the shorter version

$filteredArray = array_filter(
    $array, 
    fn($value) => array_filter(
        $value['categories'], 
        fn($categories) => $categories['id'] === 1
    )
);

print_r($filteredArray);
osh3o9ms

osh3o9ms2#

我已经修复了这个问题。类型是错误的。数组中的类别id是int类型,我使用===将其与字符串值进行比较。将其中一个转换为另一个的类型已经修复了这个问题。

9o685dep

9o685dep3#

虽然示例数据中每个子集只包含一个id元素的条目,但我假设可以有多个子数组行。
代码:(Demo

var_export(
    array_filter(
        $array,
        fn($row) => array_column($row['categories'], 'id', 'id')[1] ?? null
    )
);

作为一个小的微优化,在回调中使用条件可中断循环可以以更冗长的代码为代价。

var_export(
    array_filter(
        $array,
        function($row) {
            foreach ($row['categories'] as ['id' => $id]) {
                if ($id !== 1) {
                    return false;
                }
            }
            return true;
        }
    )
);

相关问题