You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何实现多维嵌套数组的painting字段搜索过滤?

如何在多维嵌套数组中按'painting'字段关键词过滤?

先看看你给出的原数组(PHP格式):

$originalArray = [
    [
        'id' => 1,
        'parent_name' => 'ACTIVITIES',
        'children' => []
    ],
    [
        'id' => 2,
        'parent_name' => 'ANIMALS/PETS',
        'children' => []
    ],
    [
        'id' => 3,
        'parent_name' => 'ART',
        'children' => [
            [
                'post_id' => 100,
                'child_name' => 'Bookeeping',
                'painting' => ['flower', 'beach', 'sunrise']
            ],
            [
                'post_id' => 101,
                'child_name' => 'Addiction',
                'painting' => ['sunrise', 'beach']
            ]
        ]
    ],
    [
        'id' => 4,
        'parent_name' => 'Music',
        'children' => [
            [
                'post_id' => 102,
                'child_name' => 'POP',
                'painting' => ['suntown', 'beachfull', 'sunrise']
            ],
            [
                'post_id' => 103,
                'child_name' => 'Rock',
                'painting' => ['sunrisenew', 'beachnew']
            ]
        ]
    ]
];

你的需求是:根据关键词(比如sun)过滤数组,只保留那些painting数组中包含关键词的项,同时保留完整的父级结构,并且只留下painting里匹配的元素。

实现思路

因为数组是多层嵌套的,递归函数是最适合的方案——它可以逐层遍历数组,处理每个层级的过滤逻辑:

  • 遍历顶层的每个父节点
  • 对每个父节点的children数组,逐个处理子元素
  • 过滤子元素的painting数组,只保留包含关键词的元素
  • 如果过滤后的painting不为空,就保留这个子元素;如果父节点的children里有至少一个有效子元素,就保留整个父节点
  • 递归处理可能存在的更深层级嵌套(确保扩展性)

具体代码实现

这里用PHP写一个通用的过滤函数:

function filterNestedArrayByPaintingKeyword($array, $keyword) {
    $filtered = [];
    
    foreach ($array as $item) {
        // 处理当前项的children(如果有的话)
        if (!empty($item['children'])) {
            $filteredChildren = [];
            
            foreach ($item['children'] as $child) {
                // 过滤painting数组,保留包含关键词的元素
                if (!empty($child['painting'])) {
                    $matchedPaintings = array_filter($child['painting'], function($paint) use ($keyword) {
                        return stripos($paint, $keyword) !== false; // 不区分大小写,区分的话用strpos
                    });
                    
                    // 如果有匹配的painting,保留这个子元素并替换painting为匹配结果
                    if (!empty($matchedPaintings)) {
                        $child['painting'] = $matchedPaintings;
                        $filteredChildren[] = $child;
                    }
                }
            }
            
            // 如果当前父节点有过滤后的子元素,保留该父节点并更新children
            if (!empty($filteredChildren)) {
                $item['children'] = $filteredChildren;
                $filtered[] = $item;
            }
        }
        // 没有children的父节点直接跳过(因为没有painting字段可匹配)
    }
    
    return $filtered;
}

测试使用

调用这个函数,传入原数组和关键词sun:

$result = filterNestedArrayByPaintingKeyword($originalArray, 'sun');
print_r($result);

输出结果就和你预期的完全一致:

Array
(
    [0] => Array
        (
            [id] => 3
            [parent_name] => ART
            [children] => Array
                (
                    [0] => Array
                        (
                            [post_id] => 100
                            [child_name] => Bookeeping
                            [painting] => Array
                                (
                                    [2] => sunrise
                                )
                        )
                    [1] => Array
                        (
                            [post_id] => 101
                            [child_name] => Addiction
                            [painting] => Array
                                (
                                    [0] => sunrise
                                )
                        )
                )
        )
    [1] => Array
        (
            [id] => 4
            [parent_name] => Music
            [children] => Array
                (
                    [0] => Array
                        (
                            [post_id] => 102
                            [child_name] => POP
                            [painting] => Array
                                (
                                    [0] => suntown
                                    [2] => sunrise
                                )
                        )
                    [1] => Array
                        (
                            [post_id] => 103
                            [child_name] => Rock
                            [painting] => Array
                                (
                                    [0] => sunrisenew
                                )
                        )
                )
        )
)

一些可优化的点

  • 如果需要区分大小写,把stripos改成strpos即可
  • 如果数组有更深的嵌套(比如children里还有children),可以把处理children的逻辑改成递归调用本函数,让函数支持任意深度的嵌套
  • 可以把painting字段名做成参数,让函数更通用,支持过滤其他字段

内容的提问来源于stack exchange,提问作者Bhavey Bansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:24:38