PHP array_search因数组键重复忽略首项,如何实现多天气码对应同一图标
问题根因
你排查时将问题聚焦在array_search的严格匹配逻辑上,但实际上匹配失效的根源在数组初始化阶段就已经存在:
- PHP关联数组的键名具有唯一性,重复定义同名称的键时,后一次的赋值会直接覆盖前一次的结果。
- 原代码中两次使用
'wi-day-cloudy'作为键,第一次绑定的02d条目在数组初始化时就已经被完全覆盖丢弃,最终实际存入数组的条目里根本没有值为02d的记录,无论是否开启严格比对,都不可能匹配到对应的图标类。 - 原代码的数组索引方向完全颠倒:查询的输入是具有唯一性的天气码,查询的结果是可重复的图标类,原代码反而把可重复的图标类当键、把唯一的天气码当值,才需要反向遍历数组匹配,天然会遇到重复值场景下仅返回最后一个匹配键的问题。
修复方案
将数组的索引逻辑调整为以唯一的天气码为键,对应图标类为值,从根源上避免键重复、反向匹配的问题,同时增加无匹配的兜底逻辑,避免异常输入下输出空的class属性:
function weathericon($string) { $array_icons = [ '01d' => 'wi-day-sunny', '02d' => 'wi-day-cloudy', '03d' => 'wi-day-cloudy', '04d' => 'wi-cloudy', '13d' => 'wi-day-snow' ]; // 无匹配时使用默认图标类做兜底 $icon_class = $array_icons[$string] ?? 'wi-na'; return '<i class="wi '. $icon_class .'"></i>'; }
方案优势
- 所有天气码都是唯一标识,作为键不存在覆盖问题,02d和03d作为两个独立的键,哪怕指向完全相同的图标类,也能被精准匹配
- 直接通过数组键取值,不需要反向遍历整个数组,执行效率远高于
array_search的反向匹配逻辑 - 完全规避了原逻辑中重复值导致的匹配偏差问题
内容的提问来源于stack exchange,提问作者user718990
相关产品推荐
相关产品推荐

