PHP 7.4如何单行查找嵌套数组值所属的数组键?
查找嵌套数组值并返回所属键的实现
常规函数实现
最直观的方式是遍历外层数组,对每个子数组检查是否包含目标值,找到后立即返回对应的外层键:
$sections = [ 'sectionOne' => [ 'foo', 'bar', 'hello', ], 'sectionTwo' => [ 'yo', 'heya', ], ]; function getSectionByValue($value) { global $sections; // 更推荐的写法是将$sections作为参数传入,避免依赖全局变量: // function getSectionByValue($value, array $sections) { foreach ($sections as $sectionKey => $items) { // 第三个参数true启用严格类型比较,避免"1"和1这类非预期匹配 if (in_array($value, $items, true)) { return $sectionKey; } } // 未找到匹配值时返回null return null; } // 调用示例 echo getSectionByValue('bar'); // 输出 sectionOne echo getSectionByValue('yo'); // 输出 sectionTwo echo getSectionByValue('none'); // 输出 null
单行代码实现
借助PHP 7.4的箭头函数和数组函数,可以用一行代码完成逻辑:
function getSectionByValue($value) { global $sections; // 推荐将$sections作为参数传入,提升函数独立性 return array_keys(array_filter($sections, fn($items) => in_array($value, $items, true)))[0] ?? null; }
单行代码逻辑说明
array_filter遍历外层数组,仅保留包含目标值的子数组array_keys提取这些子数组对应的外层键[0] ?? null取第一个匹配的键,若没有匹配项则返回null
额外优化建议
- 如果不同section中存在重复的value,上述实现只会返回第一个匹配的section键;若需要返回所有匹配的键,去掉
[0]即可,此时函数会返回包含所有匹配键的数组。 - 若需多次调用该函数,建议提前构建反向映射数组,后续调用直接通过键访问,效率更高:
// 提前构建值到section的映射 $valueToSection = []; foreach ($sections as $section => $items) { foreach ($items as $item) { $valueToSection[$item] = $section; } } // 后续调用直接取值 function getSectionByValue($value) { global $valueToSection; return $valueToSection[$value] ?? null; }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

