如何删除多维数组中不含services分支的元素
问题:过滤多维数组中包含
services键的元素 现有如下多维数组结构,需要删除其中所有不包含services键的元素,仅保留带有services分支的元素。尝试使用array_filter函数但未得到预期结果,求解决思路或可用函数帮助。
原数组结构
Array ( [1702] => Array ( [unit] => Unit name [info] => Array ( [735100] => Array ( [group] => Ac Fluorhidricos ) [0] => Array ( [group] => Other [services] => Array ( [731171] => [ARES70] Oil 01 [731172] => [ARES71] Oil 02 [731112] => [ARES11] Oil 03 ) ) [733496] => Array ( [group] => Activity ) [732216] => Array ( [group] => Water SMA ) [732280] => Array ( [group] => Water MAR SMA ) [732307] => Array ( [group] => Blue water SMA ) [732369] => Array ( [group] => Residual water SMA [services] => Array ( [732373] => [ARESSMA05] Water 01 [732388] => [ARESSMA20] Water 02 [732374] => [ARESSMA06] Water 03 [732397] => [ARESSMA29] Water 04 [732375] => [ARESSMA07] Water 05 ) ) ) ) )
目标数组结构
Array ( [1702] => Array ( [unit] => Unit name [info] => Array ( [0] => Array ( [group] => Other [services] => Array ( [731171] => [ARES70] Oil 01 [731172] => [ARES71] Oil 02 [731112] => [ARES11] Oil 03 ) ) [732369] => Array ( [group] => Residual water SMA [services] => Array ( [732373] => [ARESSMA05] Water 01 [732388] => [ARESSMA20] Water 02 [732374] => [ARESSMA06] Water 03 [732397] => [ARESSMA29] Water 04 [732375] => [ARESSMA07] Water 05 ) ) ) ) )
解决方法
核心思路
问题的关键是要过滤的是info子数组内的元素,而非外层的整个数组。直接使用array_filter时,需要明确指定过滤的层级,而非直接作用于最外层数组。
代码实现(单Unit场景)
直接定位到info子数组,用array_filter配合自定义回调函数筛选元素:
// 假设原数组已赋值给$originalArray $originalArray[1702]['info'] = array_filter( $originalArray[1702]['info'], function($item) { // 检查元素是否存在services键,可选添加is_array确保其为数组 return isset($item['services']) && is_array($item['services']); } ); // 输出验证结果 print_r($originalArray);
代码实现(多Unit通用场景)
如果外层有多个Unit节点,可以通过遍历处理每个Unit的info数组:
foreach ($originalArray as &$unit) { if (isset($unit['info'])) { $unit['info'] = array_filter( $unit['info'], function($item) { return isset($item['services']) && is_array($item['services']); } ); } } unset($unit); // 解除引用避免后续数组操作异常
说明
array_filter会遍历目标数组的每个元素,回调函数返回true时保留该元素,返回false则删除。- 使用
isset($item['services'])确保元素存在指定键,加上is_array是为了避免services为非数组值的情况(可根据实际需求调整)。
内容的提问来源于stack exchange,提问作者Myless
相关产品推荐
相关产品推荐

