PDO::FETCH_KEY_PAIR数组中in_array匹配变量值返回null问题
问题分析与解决
你遇到的核心问题是混淆了数组键(key)和值(value)的检查逻辑,加上代码里的变量名笔误,导致了看似矛盾的现象:
问题代码解析
原代码
$id = array(); /* PDO::FETCH_KEY_PAIR 返回的关联数组 */ $mailTo = array ( 'MailTo1' => 6143, 'MailTo2' => 6137, 'MailTo3' => 6137, ); echo $mailTo['MailTo1']; // 输出6143 $result1['needle'] = 'MailTo1'; // 来自第二个查询的目标值 if(in_array($result1['needle'], $mailTo)){ $id['mailTo'] = $mailTo[$result1['needle']]; // 返回null }
硬编码测试代码
if(in_array('MailTo1', $mailTo)){ $id['mailTo'] = $mailTo[$result['needle']]; // 输出6143 }
普通变量测试代码
$result = 'MailTo1'; if(in_array($result1, $mailTo)){ $id['mailTo'] = $mailTo[$result1]; // 返回null }
问题根源
in_array()的作用误解:
in_array($needle, $array)是检查$needle是否存在于数组的**值(value)**中,而你的$mailTo数组里,值都是数字(6143、6137等),键才是'MailTo1'这类字符串。原代码中in_array($result1['needle'], $mailTo)的判断逻辑完全错误,理论上不会进入if分支——你说进入后返回null,大概率是实际运行中存在变量值意外匹配数字的干扰情况。硬编码测试的巧合:你的硬编码测试里,
in_array('MailTo1', $mailTo)其实是false(值里没有这个字符串),但分支里用了$mailTo[$result['needle']],如果$result['needle']本身是正确的键'MailTo1',那只要分支被执行(比如测试时注释了判断条件),就能正确取值,这属于巧合掩盖了逻辑错误。普通变量测试的笔误:你定义了
$result = 'MailTo1',但判断和取值时用的是未定义的$result1,默认值为null,所以$mailTo[$result1]自然返回null。
正确解决方案
要验证某个值是否是关联数组的键,应该用array_key_exists()或者isset():
方案1:用array_key_exists()(推荐,准确检测键是否存在)
$result1['needle'] = 'MailTo1'; if(array_key_exists($result1['needle'], $mailTo)){ $id['mailTo'] = $mailTo[$result1['needle']]; // 正确获取6143 }
方案2:用isset()(适合值不为null的场景)
$result1['needle'] = 'MailTo1'; if(isset($mailTo[$result1['needle']])){ $id['mailTo'] = $mailTo[$result1['needle']]; // 正确获取6143 }
修正变量名错误
普通变量测试代码需修正变量名:
$result = 'MailTo1'; if(array_key_exists($result, $mailTo)){ $id['mailTo'] = $mailTo[$result]; // 正确获取6143 }
内容的提问来源于stack exchange,提问作者startingout
相关产品推荐
相关产品推荐

