如何实现仅当数组同时存在指定匹配键时返回天气数据?
修正后的PHP方法实现
原代码核心问题分析
- 遍历数组时仅获取了值,未正确获取键名,导致无法判断键的特征
- 逻辑矛盾:要求单个键同时匹配
_1和__last,这在实际场景中不可能实现 - 赋值语句引用错误的数组元素,无法正确提取天气值
- 未先校验两种目标键是否同时存在,直接遍历收集数据不符合需求
修正后的代码实现
// 假设$infoList是类的成员属性,需通过$this->访问 private $infoList = array( "_key_1"=>array("time"=>9, "day"=>"Tuesday", "weather"=>"sunny", "humidity"=>"80%"), "_key_2"=>array("time"=>5, "day"=>"Tuesday", "weather"=>"cloudy"), "_key__last"=>array("time"=>3, "day"=>"Sunday", "weather"=>"rainy") ); public function getData() { $result = []; // 遍历数组,收集符合条件的天气值 foreach($this->infoList as $key => $item) { // 匹配包含"_1"的键 if (strpos($key, "_1") !== false) { $result["_1"] = $item["weather"]; } // 匹配包含"__last"的键 if (strpos($key, "__last") !== false) { $result["__last"] = $item["weather"]; } } // 仅当两种目标键对应的值都存在时返回,否则返回空数组 return (isset($result["_1"]) && isset($result["__last"])) ? $result : []; }
关键改动说明
- 正确遍历键值对:使用
foreach($this->infoList as $key => $item)同时获取键名和对应数据项,解决原代码无法判断键特征的问题 - 高效的字符串匹配:用
strpos替代正则表达式,针对简单的字符串包含判断更高效;如果需要严格匹配键的后缀(如必须以_1或__last结尾),可替换为正则:// 匹配以"_1"结尾的键 if (preg_match('/_1$/', $key)) { ... } // 匹配以"__last"结尾的键 if (preg_match('/__last$/', $key)) { ... } - 先收集后校验:先遍历收集所有符合条件的数据,再校验两种目标值是否同时存在,符合需求逻辑
- 规范变量访问:类方法中访问成员属性需用
$this->infoList,避免全局变量的不规范使用
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

