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

如何删除多维数组中不含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:25:56