文章大纲

php里array_merge函数必须警惕的大坑

2023-02-15 09:42:02

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





我要评论
评论列表