之前写过一篇有关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;