全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

PHP怎么把XML对象转换成数组

最常用、可靠的方式是用递归函数手动遍历并构建数组,能准确区分属性、文本、子节点并处理重复标签;而json_decode(json_encode((array)$xml), true)易丢失属性、覆盖同名节点,仅适用于无属性无重复的简单场景。

PHP 将 XML 对象(SimpleXMLElement)转成数组,最常用、可靠的方式是用递归函数手动遍历并构建数组。因为 json_decode(json_encode((array)$xml), true) 这种“伪转换”在属性、文本混合、重复子节点、CDATA 等场景下容易出错或丢失数据。

用递归函数安全转换(推荐)

这个方法能准确区分元素属性、文本内容、子节点,并保留结构层次:

function xmlToArray($xml) {
    if (!($xml instanceof SimpleXMLElement)) {
        return $xml;
    }

    $array = [];
    // 处理属性
    $attributes = $xml->attributes();
    if ($attributes && count($attributes) > 0) {
        foreach ($attributes as $attr => $value) {
            $array['@attributes'][$attr] = (string)$value;
        }
    }

    // 处理子节点(含文本节点)
    $children = $xml->children();
    if (count($children) > 0) {
        foreach ($children as $childName => $child) {
            $childArray = xmlToArray($child);
            if (!isset($array[$childName])) {
                $array[$childName] = $childArray;
            } else {
                // 同名子节点多个时转为数组(避免覆盖)
                if (!is_array($array[$childName]) || !isset($array[$childName][0])) {
                    $array[$childName] = [$array[$childName]];
                }
                $array[$childName][] = $childArray;
            }
        }
    } else {
        // 只有文本内容(无子节点)
        $text = trim((string)$xml);
        if ($text !== '' || isset($array['@attributes'])) {
            $array['#text'] = $text;
        }
    }

    return $array;
}

// 使用示例
$xmlStr = '张三ab';
$xml = simplexml_load_string($xmlStr);
$result = xmlToArray($xml);
print_r($result);

处理简单 XML(无属性、无重复标签)可快速转换

如果 XML 结构非常规整(比如全是单层子节点、无属性、无同名多节点),可用更简方式:

  • 先转 JSON 再解码:$arr = json_decode(json_encode($xml), true);
  • 但注意:它会把属性丢掉,同名子节点只保留最后一个,文本和子节点混同时行为不可控
  • 仅适合测试或内部简单配置类 XML,不建议用于生产环境解析外部 XML

注意事项和常见坑

  • SimpleXMLElement 不是标准对象:不能直接用 (array)$xml 强转,会丢失结构信息
  • 同名子节点会被覆盖:必须手动判断是否已存在,再转为数组,否则第二个 会覆盖第一个
  • 空元素或纯属性元素:如 ,需靠 @attributes#text 区分逻辑
  • 命名空间 XML:加载时要用 simplexml_load_string($xml, null, LIBXML_NOBLANKS, 'ns') 并在递归中调用 $xml->children('ns', true)

基本上就这些。核心是别图省事用 json 中转,写个十几行递归函数反而更稳、更可控。


# php  # js  # json  # 递归函数  # Array  # NULL  # 命名空间  # xml  # 递归  # 对象  # 遍历  # 最常用  # 第一个  # 多个  # 适用于  # 并在  # 第二个  # 十几  # 会把 


相关文章: 如何在建站宝盒中设置产品搜索功能?  教程网站设计制作软件,怎么创建自己的一个网站?  制作网站的公司有哪些,做一个公司网站要多少钱?  三星网站视频制作教程下载,三星w23网页如何全屏?  ,购物网站怎么盈利呢?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何确保FTP站点访问权限与数据传输安全?  h5在线制作网站电脑版下载,h5网页制作软件?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  建站之星展会模版如何一键下载生成?  如何通过FTP服务器快速搭建网站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  建站之星如何优化SEO以实现高效排名?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何高效完成独享虚拟主机建站?  建站之星如何通过成品分离优化网站效率?  专业公司网站制作公司,用什么语言做企业网站比较好?  做企业网站制作流程,企业网站制作基本流程有哪些?  如何在IIS中新建站点并配置端口与物理路径?  利用JavaScript实现拖拽改变元素大小  完全自定义免费建站平台:主题模板在线生成一站式服务  如何获取开源自助建站系统免费下载链接?  C++如何编写函数模板?(泛型编程入门)  如何解决ASP生成WAP建站中文乱码问题?  建站上市公司网站建设方案与SEO优化服务定制指南  如何用低价快速搭建高质量网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何通过VPS建站实现广告与增值服务盈利?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何高效利用亚马逊云主机搭建企业网站?  C++如何使用std::optional?(处理可选值)  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  宝塔新建站点报错如何解决?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何登录建站主机?访问步骤全解析  如何在阿里云香港服务器快速搭建网站?  移民网站制作流程,怎么看加拿大移民官网?  北京专业网站制作设计师招聘,北京白云观官方网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何制作一个表白网站视频,关于勇敢表白的小标题?  建站之星如何一键生成手机站?  建站之星代理如何优化在线客服效率?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  制作营销网站公司,淘特是干什么用的?  如何通过远程VPS快速搭建个人网站?  建站之星代理费用多少?最新价格详情介绍  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  javascript中的try catch异常捕获机制用法分析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。