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

如何获取嵌套数组中的任意ID值?现有代码仅能获取首层ID

搞定嵌套数组的ID查找与收集问题

嘿,我来帮你解决这个嵌套数组的ID处理问题~你当前的代码只能遍历数组的第一层,所以没法触及深层嵌套的ID。对付这种层级不确定的嵌套结构,递归函数是最顺手的工具,它能逐层深入遍历每一个子元素。

一、根据指定ID查找对应节点(支持任意层级)

我们可以写一个递归辅助函数,遍历整个嵌套数组,精准定位到匹配$id的节点,不管它在第几层:

public function index($id) {
    $categories= array(
        array('id' => 1 , 'category_name' => 'Vehicle', array('id' => 4 , 'category_name' => 'Bmw',array('id' => 5 , 'category_name' => 'Mercedes' , array('id' => 6 , 'category_name' => 'Bmw X7')))),
        array('id' => 2 , 'category_name' => 'TV', array('id' => 8 , 'category_name' => 'Led TV' , array('id' => 9 , 'category_name' => 'Philips'))),
        array('id' => 3 , 'category_name' => 'Phone' , array('id' => 10 , 'category_name' => 'Samsung'))
    );

    // 递归查找的匿名函数
    $findCategoryById = function($array, $targetId) use (&$findCategoryById) {
        foreach ($array as $item) {
            // 先判断当前项是包含id的数组
            if (is_array($item) && isset($item['id'])) {
                // 找到匹配的ID就返回当前节点
                if ($item['id'] == $targetId) {
                    return $item;
                }
                // 如果有子数组(索引为0的元素),就递归深入查找
                if (isset($item[0]) && is_array($item[0])) {
                    $result = $findCategoryById($item[0], $targetId);
                    if ($result) {
                        return $result;
                    }
                }
            }
        }
        return null; // 没找到对应ID就返回null
    };

    $parent_category = $findCategoryById($categories, $id);
    // 这里可以根据需求处理结果,比如打印或者返回
    var_dump($parent_category);
}

比如调用index(6),就能直接拿到深层的array('id' => 6, 'category_name' => 'Bmw X7')节点。

二、收集嵌套数组里的所有ID值

如果需要把所有层级的ID都收集到一个数组里,同样用递归就能轻松实现:

public function getAllCategoryIds() {
    $categories= array(
        array('id' => 1 , 'category_name' => 'Vehicle', array('id' => 4 , 'category_name' => 'Bmw',array('id' => 5 , 'category_name' => 'Mercedes' , array('id' => 6 , 'category_name' => 'Bmw X7')))),
        array('id' => 2 , 'category_name' => 'TV', array('id' => 8 , 'category_name' => 'Led TV' , array('id' => 9 , 'category_name' => 'Philips'))),
        array('id' => 3 , 'category_name' => 'Phone' , array('id' => 10 , 'category_name' => 'Samsung'))
    );

    $allIds = [];
    // 递归收集ID的匿名函数
    $collectIds = function($array) use (&$collectIds, &$allIds) {
        foreach ($array as $item) {
            if (is_array($item) && isset($item['id'])) {
                $allIds[] = $item['id'];
                // 遇到子数组就继续递归收集
                if (isset($item[0]) && is_array($item[0])) {
                    $collectIds($item[0]);
                }
            }
        }
    };

    $collectIds($categories);
    return $allIds; // 返回的结果是:[1,4,5,6,2,8,9,3,10]
}

小说明

  • 递归函数里用use (&$函数名)是PHP实现匿名递归的写法,确保函数能调用自身。
  • 每次遍历都会先检查当前元素是否是带id的数组,再判断有没有子数组,确保不会漏掉任何一层的节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:53:20