多维数组键验证:检测传入数组中缺失的必填键
多维数组必填键验证函数问题排查
需求是验证多维数组是否包含所有必填键(不关心键对应的值),比如示例中需要检测出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; }
这个函数存在多个致命问题:
- 变量名不匹配:函数定义的参数是
$incoming_data和$required_data,但循环里使用未定义的$required和$data,直接导致PHP报错,逻辑无法正常执行。 - 遍历逻辑错误:没有区分必填数组中的两种元素类型:
- 像
'firstname'这种直接的字符串元素(无键),循环时$key是数字索引(0、1),$value才是真正的必填键名,此时代码判断isset($data[$key])完全错误,应该检查$incoming_data中是否存在$value这个键。 - 像
'shipping' => [...]这种带键的嵌套数组,代码没有正确识别$key为必填父键、$value为子级必填规则。
- 像
- 递归触发条件错误:现有代码判断
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
相关产品推荐
相关产品推荐

