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
相关产品推荐
相关产品推荐

