如何通过匹配嵌套多维数组的name键创建新一维数组
解决方案:匹配一维数组与嵌套多维数组的
name键并生成新数组 从你提供的数组格式判断,假设你使用的是PHP,下面针对两种常见需求给出具体实现方案:
需求1:筛选出一维数组中存在于多维数组name键里的值
如果你想生成一个新数组,只保留一维数组中在multi所有层级name字段里存在的项,可以按以下步骤操作:
- 递归遍历多维数组,收集所有
name值:由于multi包含嵌套的categories子数组,需要递归遍历所有层级,把所有name值收集到一个一维数组中。 - 用数组交集筛选匹配项:使用
array_intersect函数,找出目标一维数组和收集到的name数组的交集,即为匹配结果。
代码示例
// 给定的嵌套多维数组 $multi = [ [ 'id' => '4d4b7104d754a06370d81259', 'name' => 'Arts & Entertainment', 'pluralName' => 'Arts & Entertainment', 'shortName' => 'Arts & Entertainment', 'icon' => [ 'prefix' => 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/default_', 'suffix' => '.png' ], 'categories' => [ [ 'id' => '56aa371be4b08b9a8d5734db', 'name' => 'Amphitheater', 'pluralName' => 'Amphitheaters' ] ] ] ]; // 递归收集所有层级的name值 function collectAllNames($array) { $names = []; foreach ($array as $item) { if (isset($item['name'])) { $names[] = $item['name']; // 递归处理子分类数组 if (isset($item['categories']) && is_array($item['categories'])) { $names = array_merge($names, collectAllNames($item['categories'])); } } } return $names; } // 你的目标一维数组 $targetArray = ["Amphitheater", "Music Venue", "Arts & Entertainment"]; // 获取所有name的集合 $allCategoryNames = collectAllNames($multi); // 筛选出匹配的项 $matchedArray = array_intersect($targetArray, $allCategoryNames); // 输出结果 print_r($matchedArray);
执行后输出:
Array ( [0] => Amphitheater [2] => Arts & Entertainment )
需求2:提取匹配name对应的id生成新数组
如果你想根据一维数组的name值,从multi中提取对应的id生成新数组,可以这样实现:
- 递归生成
name与id的映射表:遍历多维数组,创建一个键为name、值为id的关联数组。 - 根据目标数组映射出对应的
id:使用array_map遍历目标数组,从映射表中取出对应的id,最后过滤掉不存在的项。
代码示例
// 递归生成name到id的映射 function createNameIdMap($array) { $map = []; foreach ($array as $item) { if (isset($item['name'], $item['id'])) { $map[$item['name']] = $item['id']; // 递归处理子分类 if (isset($item['categories']) && is_array($item['categories'])) { $map = array_merge($map, createNameIdMap($item['categories'])); } } } return $map; } // 生成映射表 $nameToId = createNameIdMap($multi); // 目标一维数组 $targetArray = ["Amphitheater", "Arts & Entertainment"]; // 获取对应的id数组 $matchedIds = array_map(function($name) use ($nameToId) { return $nameToId[$name] ?? null; // 用null标记不存在的项 }, $targetArray); // 过滤掉不存在的项 $matchedIds = array_filter($matchedIds); // 输出结果 print_r($matchedIds);
执行后输出:
Array ( [0] => 56aa371be4b08b9a8d5734db [1] => 4d4b7104d754a06370d81259 )
额外说明
- 如果你使用的是其他语言(比如JavaScript),核心思路一致:递归/迭代遍历多维数组收集
name,再进行匹配或映射。 - 如果
multi数组规模较大,递归可能存在性能瓶颈,可以改用迭代遍历的方式(用栈或队列实现)。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

