如何获取嵌套数组中的任意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
相关产品推荐
相关产品推荐

