根据wid搜索数组获取cid时出现Undefined offset错误的原因及解决
问题原因分析
你遇到的这个错误核心原因是:array_column()会返回一个重新索引的新数组,而array_search()返回的是这个新数组的索引,并非原数组的键!
咱们拆解一下你的代码:
当你执行array_column($proximity, 'wid')时,得到的数组是:
[4, 1, 2]
这个新数组的索引是连续的0、1、2,和原数组的键0、1、3完全没关系。
- 搜索wid=4时,
array_search()返回新数组的索引0,刚好原数组也有键0,所以能正常取值; - 搜索wid=1时,返回新数组的索引1,原数组也有键1,碰巧没问题;
- 但搜索wid=2时,
array_search()返回新数组的索引2,可原数组里根本没有键为2的元素,自然就抛出Undefined offset: 2的错误了!
解决方案
这里给你几种实用的解决办法,按需选择:
方法一:构建wid到原数组键的映射(推荐)
先遍历原数组,创建一个wid => 原数组键的映射表,之后就能直接通过wid快速取值,效率最高:
$proximity = array( '0' => array ('wid' => 4, 'cid' => 100), '1' => array ('wid' => 1, 'cid' => 50), '3' => array ('wid' => 2, 'cid' => 50) ); // 构建wid到原键的映射 $widToKey = []; foreach ($proximity as $key => $item) { $widToKey[$item['wid']] = $key; } // 查找wid=2对应的cid $targetWid = 2; if (isset($widToKey[$targetWid])) { $cid = $proximity[$widToKey[$targetWid]]['cid']; print_r($cid); // 输出50 } else { echo "未找到对应wid的记录"; }
方法二:直接遍历原数组查找
如果数组规模不大,直接遍历查找更直观,也不用担心索引问题:
$proximity = array( '0' => array ('wid' => 4, 'cid' => 100), '1' => array ('wid' => 1, 'cid' => 50), '3' => array ('wid' => 2, 'cid' => 50) ); $targetWid = 2; $cid = null; foreach ($proximity as $item) { if ($item['wid'] === $targetWid) { $cid = $item['cid']; break; // 找到就停止遍历,提升效率 } } if ($cid !== null) { print_r($cid); // 输出50 } else { echo "无匹配的wid"; }
方法三:用array_filter筛选后取键
利用array_filter筛选出符合条件的元素,再取对应的原键:
$proximity = array( '0' => array ('wid' => 4, 'cid' => 100), '1' => array ('wid' => 1, 'cid' => 50), '3' => array ('wid' => 2, 'cid' => 50) ); $targetWid = 2; $matchedItems = array_filter($proximity, function($item) use ($targetWid) { return $item['wid'] === $targetWid; }); if (!empty($matchedItems)) { $firstKey = array_keys($matchedItems)[0]; print_r($proximity[$firstKey]['cid']); // 输出50 } else { echo "未找到对应记录"; }
内容的提问来源于stack exchange,提问作者Nkk
相关产品推荐
相关产品推荐

