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

多维数组键验证:检测传入数组中缺失的必填键

多维数组必填键验证函数问题排查

需求是验证多维数组是否包含所有必填键(不关心键对应的值),比如示例中需要检测出lastname和city这两个缺失的必填键。现有validate函数在传入数组无值时有效,但添加值后失效,下面是问题排查和修复方案:

示例代码

// 必填键定义
$required_data = [
    'firstname',
    'lastname',
    'shipping' => [
        'address',
        'city',
        'contacts' => [
            'phone',
            'email'
        ]
    ]
];

// 待验证的输入数据
$incoming_data = [
    'firstname' => 'Mike',
    'shipping' => [
        'address' => '1st Avenue',
        'contacts' => [
            'phone',
            'email' => 'test@example.com'
        ]
    ]
];

现有函数的问题分析

function validate($incoming_data, $required_data)
{
    foreach ($required as $key => $value) {
        if (!isset($data[$key])) {
            return false;
        }
        if (is_array($data[$key]) && false === validate($data[$key], $value)) {
            return false;
        }
    }
    return true;
}

这个函数存在多个致命问题:

  1. 变量名不匹配:函数定义的参数是$incoming_data和$required_data,但循环里使用未定义的$required和$data,直接导致PHP报错,逻辑无法正常执行。
  2. 遍历逻辑错误:没有区分必填数组中的两种元素类型:
    • 像'firstname'这种直接的字符串元素(无键),循环时$key是数字索引(0、1),$value才是真正的必填键名,此时代码判断isset($data[$key])完全错误,应该检查$incoming_data中是否存在$value这个键。
    • 像'shipping' => [...]这种带键的嵌套数组,代码没有正确识别$key为必填父键、$value为子级必填规则。
  3. 递归触发条件错误:现有代码判断is_array($data[$key])才递归,但实际应该是当$value是数组(即存在子级必填规则)时,才需要递归验证对应的输入数据,和输入数据的对应值是否为数组无关。

修复后的验证函数

function validate($incoming_data, $required_data)
{
    foreach ($required_data as $key => $value) {
        // 确定当前要检查的目标键:带键规则用$key,直接字符串必填键用$value
        $targetKey = is_string($key) ? $key : $value;
        
        // 目标键不存在直接返回false
        if (!isset($incoming_data[$targetKey])) {
            return false;
        }
        
        // 嵌套规则递归验证子级数据
        if (is_array($value)) {
            if (!validate($incoming_data[$targetKey], $value)) {
                return false;
            }
        }
    }
    return true;
}

验证效果

调用validate($incoming_data, $required_data)会返回false,正确检测出lastname和city的缺失,符合需求。

内容的提问来源于stack exchange,提问作者user1274113

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:15:35