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

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
}

问题根源

  1. in_array()的作用误解:in_array($needle, $array)是检查$needle是否存在于数组的**值(value)**中,而你的$mailTo数组里,值都是数字(6143、6137等),键才是'MailTo1'这类字符串。原代码中in_array($result1['needle'], $mailTo)的判断逻辑完全错误,理论上不会进入if分支——你说进入后返回null,大概率是实际运行中存在变量值意外匹配数字的干扰情况。

  2. 硬编码测试的巧合:你的硬编码测试里,in_array('MailTo1', $mailTo)其实是false(值里没有这个字符串),但分支里用了$mailTo[$result['needle']],如果$result['needle']本身是正确的键'MailTo1',那只要分支被执行(比如测试时注释了判断条件),就能正确取值,这属于巧合掩盖了逻辑错误。

  3. 普通变量测试的笔误:你定义了$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:00:57