PHP四级多维关联数组检索:根据Link字段返回Title及Access信息
四级多维关联数组的Link检索实现
需求说明
给定四级多维关联数组,实现检索功能:当指定Link字段值存在时,返回对应的Title及该条Access下的完整信息。
示例数组结构
假设你的数组结构如下(可根据实际键名调整大小写,比如Link/Title):
$userAccess = [ 'module1' => [ 'sectionA' => [ 'title' => '用户管理', 'access' => [ ['link' => '/user/list', 'name' => '用户列表', 'permission' => 'read'], ['link' => '/user/add', 'name' => '添加用户', 'permission' => 'write'] ] ], 'sectionB' => [ 'title' => '权限管理', 'access' => [ ['link' => '/permission/assign', 'name' => '分配权限', 'permission' => 'write'], ['link' => '/user/list', 'name' => '查看用户权限', 'permission' => 'read'] ] ] ], 'module2' => [ 'sectionC' => [ 'title' => '系统设置', 'access' => [ ['link' => '/system/config', 'name' => '配置修改', 'permission' => 'admin'] ] ] ] ];
检索函数实现
针对四级结构编写的遍历检索函数,支持匹配多个符合条件的条目:
function searchUserAccess($accessData, $targetLink) { $result = []; // 遍历一级模块节点 foreach ($accessData as $module) { // 遍历二级分区节点 foreach ($module as $section) { // 跳过无access数组的节点 if (!isset($section['access']) || !is_array($section['access'])) { continue; } // 遍历每个access条目 foreach ($section['access'] as $accessItem) { // 匹配目标link(全等匹配,可根据需求改为模糊匹配) if (isset($accessItem['link']) && $accessItem['link'] === $targetLink) { $result[] = [ 'title' => $section['title'] ?? '无标题', 'access' => $accessItem ]; } } } } return $result; }
调用示例
// 检索link为'/user/list'的条目 $searchResult = searchUserAccess($userAccess, '/user/list'); // 输出结果 print_r($searchResult);
输出结果
Array ( [0] => Array ( [title] => 用户管理 [access] => Array ( [link] => /user/list [name] => 用户列表 [permission] => read ) ) [1] => Array ( [title] => 权限管理 [access] => Array ( [link] => /user/list [name] => 查看用户权限 [permission] => read ) ) )
注意事项
- 键名大小写:如果你的数组中字段是大写(如
Link/Title),请将代码中的'link'/'title'对应修改为大写键名。 - 匹配规则:当前使用
===精确匹配,若需要模糊匹配,可替换为strpos($accessItem['link'], $targetLink) !== false。 - 容错处理:代码中加入了
isset()和??运算符,避免因节点缺失title或access字段导致报错。
通用递归版本(适配任意层级)
如果后续数组层级可能变化,可使用递归函数实现更灵活的检索:
function searchUserAccessRecursive($data, $targetLink) { $result = []; foreach ($data as $item) { // 识别包含title和access的节点 if (isset($item['title'], $item['access']) && is_array($item['access'])) { foreach ($item['access'] as $access) { if (isset($access['link']) && $access['link'] === $targetLink) { $result[] = [ 'title' => $item['title'], 'access' => $access ]; } } } // 递归遍历嵌套数组 elseif (is_array($item)) { $result = array_merge($result, searchUserAccessRecursive($item, $targetLink)); } } return $result; }
内容的提问来源于stack exchange,提问作者Raymond
相关产品推荐
相关产品推荐

