You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决array_merge_recursive数字键异常及移除键名@符号问题

问题:移除数组键名中的@符号

原始数据

/EXT/123/SOMEPARAM:VALUE123
/EXT/123/other:VALUE222

问题背景与数组生成代码

我编写代码将上述路径格式的文本转换为嵌套结构数组时,发现数字键名会导致array_merge_recursive生成错误的数组结构。于是给数字键名前添加@符号,得到了结构正确的数组,生成代码如下:

$astdb_array=explode("\n", $astdb_raw);

$db_data = []; $result=[];
foreach($astdb_array as $db_row){

  $db_row = trim(preg_replace('/\s/', '', $db_row));
  $row_elements = explode('/', $db_row);

   if(sizeof($row_elements)>0){
       $key = array_shift($row_elements);
       #$db_data= create_array($row_elements);
       foreach(array_reverse($row_elements) as $child){

             if (strpos($child, ':') !== false) {
                [$kkey, $vval] = explode(':',$child);
                $key = [$kkey => $key = $vval];
            }else{
                    if(is_numeric($child)){
                          $key = [ '@'.$child => $key];
                    }else{
                          $key = [$child => $key];
                    }
             }
       }
 $db_data[]=$key;
   }
}
$array_result = call_user_func_array('array_merge_recursive',$db_data);
print json_encode($array_result);

代码执行结果

Array
(
    [EXT] => Array
        (
            [@104] => Array
                (
                    [MOBILE] => 77761587000
                    [TENANT] => customer1
                    [TRUNK] => customer1
                    [TRUNKID] => 2
                )

            [@110] => Array
                (
                    [MOBILE] => 77761587000
                    [TENANT] => customer1
                    [TENANTID] => 2
                    [TRUNK] => customer1
                    [TRUNKID] => 2
                )

        )

    [ROUTES] => Array
        (
            [@1] => Array
                (
                    [PATTERN] => 5555
                    [PERMS] => type,any,end
                )

            [@2] => Array
                (
                    [NAME] => KZ
                    [PATTERN] => _XXXXXXXXXXX
                    [PERMS] => type,any,end
                    [TYPE] => OUTDOOR
                )

        )

)

数组结构符合预期,但键名中的@符号需要移除。尝试了以下代码但未生效:

$result = array_map(function($s){return str_replace('@','',$s);}, $array_result);

已解决:移除@符号的方案

最终通过以下代码成功移除了键名中的@符号:

array_map(function(&$a){
     $kv=[];
     array_walk($a,function($v,&$k) use (&$kv) { $k=str_replace('@','',$k);   $kv[$k] = $v; }   );
     return $kv;
}, $array_result);

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:23:19