之前写过一篇有关array_merge函数使用的文章:http://www.zhai14.com/blog/detail-use-of-array-merge.html
没曾想,今天又踩到这个函数的坑了。
就是工作中有一个从ini文件配置中读取设备状态的功能,最近用户发现有一台设备编号20001011的状态不正确,即跟ini配置数据不对应。
读取设备ini文件的代码具体如下:
private function getIniForLocation($ini){ $res = array(); if(is_array($ini)){ foreach($ini as $i){ $currentIni = array(); if(is_array($i)){ //用于多工位ini文件 if(!empty($i[0]) && is_file($i[0])){ $equipmentNo = basename($i[0],'.ini'); $iniData = $this->getIniForMultipleSection($i[0]); $currentIni = array($equipmentNo => $iniData); } }else{ if(is_file($i)){ $currentIni = parse_ini_file($i,true); } } $res = array_merge($res, $currentIni); } }else{ if(is_file($ini)){ $res = parse_ini_file($ini,true); } } return $res; } private function getIniForMultipleSection($ini) { $data = parse_ini_file($ini,true); $currentIni = array(); $status = "stop"; if(is_array($data)){ foreach($data as $item){ $currentIni = $item; if("run" == $item['status']){ //只要有一个是run,那么整体状态就是run $status = "run"; break; } } } $currentIni['status'] = $status; return $currentIni; }
设备20001011的ini文件数据如下所示:
[20001025] status = "run" time = "2023/02/15 08:40:58" Cycle = 1 Done = 345 Normal Lock = 0 Failed Lock = 200 Normal without Lock = 145 Failed without Lock = 0 Failed Displacement = 0 Displacement = 0.00 Motor Position = 111.76 Force = 42.35
经过调试,才发现最终问题出在array_merge这个函数上。
array_merge合并key值是字符串的数组没什么问题,但此处20001011这个设备编号经过parse_ini_file函数对ini文件解析后,20001011变成了数组的整型索引,一旦array merge,20001011这个整型索引就会消失
因此遍历设备时,就取不到20001011这个设备的ini数据了。
将这行代码
$res = array_merge($res, $currentIni);
换成如下代码即可:
$res = $res + $currentIni;