PHP多维数组中提取指定uniqe_id值的完整嵌套路径
解决PHP多维嵌套数组提取指定元素完整路径的问题
我来帮你搞定这个从多维嵌套数组里提取指定元素完整父级路径的问题~针对你给出的JSON数组,我们可以用递归函数来实现这个需求,因为数组是多层嵌套的,递归能很方便地逐层遍历并回溯路径。
实现步骤
- 先把JSON字符串解码成PHP数组;
- 编写递归函数,遍历数组元素,匹配目标
uniqe_id,同时记录遍历过的父级路径; - 调用函数并输出结果。
完整代码示例
<?php // 你的JSON数据 $json = '[{"id":8,"uniqe_id":"tmr955q0","nome":"Vini e Bollicine","parent_id":null,"tipo":"submenu","link":null,"created_at":"2018-01-28 18:33:42","updated_at":"2018-01-28 18:36:45","children":{"9":{"id":9,"uniqe_id":"icmxpxyt","nome":"Italia","parent_id":8,"tipo":"submenu","link":null,"created_at":"2018-01-28 18:58:06","updated_at":"2018-01-28 19:20:45","children":{"10":{"id":10,"uniqe_id":"hpgmsm71","nome":"Cantina Sant\'Andrea","parent_id":9,"tipo":"link","link":"https://www.google.it/","created_at":"2018-01-28 19:21:40","updated_at":"2018-01-28 19:21:40","children":[]}}}}},{"id":11,"uniqe_id":"8c81t2jr","nome":"Birre Classic","parent_id":null,"tipo":"submenu","link":null,"created_at":"2018-01-28 18:33:42","updated_at":"2018-01-29 11:48:09","children":{"12":{"id":12,"uniqe_id":"1ma148y4","nome":"Germania","parent_id":11,"tipo":"submenu","link":"https://www.google.it/","created_at":"2018-01-28 18:58:06","updated_at":"2018-01-29 15:40:51","children":{"13":{"id":13,"uniqe_id":"vai1fmki","nome":"Radeberger","parent_id":12,"tipo":"link","link":"https://www.google.it/","created_at":"2018-01-28 19:21:40","updated_at":"2018-01-29 13:02:23","children":[]},"14":{"id":14,"uniqe_id":"ffynhlzb","nome":"Warsteiner","parent_id":12,"tipo":"link","link":"https://alaindifabio.com/","created_at":"2018-01-28 21:41:38","updated_at":"2018-01-29 13:02:28","children":[]}}},"15":{"id":15,"uniqe_id":"r03gx6rs","nome":"Italia","parent_id":11,"tipo":"submenu","link":null,"created_at":"2018-01-28 21:42:26","updated_at":"2018-01-28 21:42:26","children":{"16":{"id":16,"uniqe_id":"8v3pgirb","nome":"Baladin","parent_id":15,"tipo":"link","link":"https://alaindifabio.com/","created_at":"2018-01-28 21:43:37","updated_at":"2018-01-28 21:43:37","children":[]}}},"17":{"id":17,"uniqe_id":"3qb5sr5p","nome":"About","parent_id":11,"tipo":"link","link":"https://www.google.it/","created_at":"2018-01-29 15:24:37","updated_at":"2018-01-29 15:24:37","children":[]}}}]'; // 解码成PHP关联数组 $menu = json_decode($json, true); /** * 递归查找指定uniqe_id的元素完整路径 * @param array $items 当前遍历的数组 * @param string $targetUniqeId 目标uniqe_id * @param array $currentPath 当前已构建的路径 * @return array|null 找到的路径数组,未找到则返回null */ function findPathByUniqeId($items, $targetUniqeId, $currentPath = []) { foreach ($items as $item) { // 将当前元素的nome加入临时路径(可替换为id/uniqe_id等其他字段) $tempPath = array_merge($currentPath, [$item['nome']]); // 匹配到目标元素,返回完整路径 if ($item['uniqe_id'] === $targetUniqeId) { return $tempPath; } // 如果有子元素,递归遍历子元素 if (!empty($item['children'])) { // 把children的关联数组转成索引数组再遍历 $result = findPathByUniqeId(array_values($item['children']), $targetUniqeId, $tempPath); if ($result !== null) { return $result; } } } // 未找到目标元素 return null; } // 目标uniqe_id $targetId = '8v3pgirb'; // 获取路径 $path = findPathByUniqeId($menu, $targetId); // 输出结果 if ($path) { echo '完整路径:' . implode(' -> ', $path); } else { echo '未找到指定uniqe_id的元素'; } ?>
代码说明
- 递归函数会逐层遍历数组,每进入一个层级就把当前元素的
nome加入路径; - 一旦匹配到目标
uniqe_id,就返回已经构建好的完整路径; - 如果需要路径显示其他字段(比如
id或者uniqe_id),只需要把$item['nome']换成对应的字段名即可; - 代码里用
array_values($item['children'])把children的关联数组转成索引数组,确保遍历所有子元素。
运行结果
针对你指定的uniqe_id: 8v3pgirb,运行代码后会输出:
完整路径:Birre Classic -> Italia -> Baladin
内容的提问来源于stack exchange,提问作者snakom23
相关产品推荐
相关产品推荐

