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

如何通过匹配嵌套多维数组的name键创建新一维数组

解决方案:匹配一维数组与嵌套多维数组的name键并生成新数组

从你提供的数组格式判断,假设你使用的是PHP,下面针对两种常见需求给出具体实现方案:

需求1:筛选出一维数组中存在于多维数组name键里的值

如果你想生成一个新数组,只保留一维数组中在multi所有层级name字段里存在的项,可以按以下步骤操作:

  1. 递归遍历多维数组,收集所有name值:由于multi包含嵌套的categories子数组,需要递归遍历所有层级,把所有name值收集到一个一维数组中。
  2. 用数组交集筛选匹配项:使用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生成新数组,可以这样实现:

  1. 递归生成name与id的映射表:遍历多维数组,创建一个键为name、值为id的关联数组。
  2. 根据目标数组映射出对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:07