解决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
相关产品推荐
相关产品推荐

