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

PHP多层嵌套索引数组遍历:提取数字与嵌套数组id值

高效提取多层嵌套数组中的数字与ID值

嘿,我完全懂你现在的困扰——多层嵌套数组用多层foreach处理不仅繁琐,后期维护也麻烦。这里有两个高效的解决方案,不管数组嵌套多深,都能轻松提取你需要的数字和ID值:

方法一:递归函数(简洁易读,适合常规场景)

递归是处理嵌套数组最直观的方式,我们可以写一个通用的提取函数,自动遍历所有层级的元素:

function extractValues($array) {
    $result = [];
    
    foreach ($array as $item) {
        if (is_array($item)) {
            // 遇到嵌套数组,递归处理并合并结果
            $result = array_merge($result, extractValues($item));
        } elseif (is_numeric($item)) {
            // 遇到纯数字元素,直接加入结果集
            $result[] = $item;
        } elseif (isset($item['id'])) {
            // 遇到带id的关联数组,提取id值
            $result[] = $item['id'];
        }
    }
    
    return $result;
}

// 你的测试数组
$myarray = [
    [],
    [16534],
    [],
    [16532, 16533],
    [],
    [14869],
    [['id' => 269, 'hours' => 21.0]],
    [
        [
            ['id' => 2, 'hours' => 12.0],
            ['id' => 7, 'hours' => 24.0]
        ],
        [
            ['id' => 2, 'hours' => 5.0],
            ['id' => 7, 'hours' => 0.583]
        ]
    ]
];

// 调用函数并输出结果
$extracted = extractValues($myarray);
echo '<pre>' . print_r($extracted, true) . '</pre>';

这个函数会自动处理所有层级:

  • 空数组直接跳过
  • 纯数字元素直接收集
  • 嵌套数组递归深入处理
  • 带id键的关联数组,自动提取id值

方法二:迭代式遍历(更稳定,避免递归栈溢出)

如果你的数组嵌套层级特别深(比如超过PHP默认的递归深度限制),递归可能会触发报错。这时候用迭代方式(借助栈结构)更安全:

function extractValuesIterative($array) {
    $result = [];
    $stack = [$array]; // 用栈存储待处理的数组
    
    while (!empty($stack)) {
        $current = array_pop($stack); // 取出栈顶的数组
        
        foreach ($current as $item) {
            if (is_array($item)) {
                // 嵌套数组压入栈,等待后续处理
                array_push($stack, $item);
            } elseif (is_numeric($item)) {
                $result[] = $item;
            } elseif (isset($item['id'])) {
                $result[] = $item['id'];
            }
        }
    }
    
    // 栈是后进先出,结果顺序会和递归相反,若需要原顺序可反转数组
    // $result = array_reverse($result);
    return $result;
}

// 调用迭代函数
$extractedIterative = extractValuesIterative($myarray);
echo '<pre>' . print_r($extractedIterative, true) . '</pre>';

迭代方法的优势是不受递归深度限制,处理超大、超深的数组更稳定。如果需要和原数组一致的提取顺序,要么把栈改成队列(用array_shift代替array_pop),要么最后反转结果数组即可。

最终提取结果

两种方法最终都会得到如下结果:

Array
(
    [0] => 16534
    [1] => 16532
    [2] => 16533
    [3] => 14869
    [4] => 269
    [5] => 2
    [6] => 7
    [7] => 2
    [8] => 7
)

这样就不用写多层嵌套的foreach了,代码复用性也高,下次遇到类似的嵌套数组直接调用函数就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:12:50