【问题标题】:PHP create array from xml with recursive methodPHP使用递归方法从xml创建数组
【发布时间】:2021-04-23 17:53:10
【问题描述】:

需要实现一个可以接受第二个子节点的递归函数,我试图循环第二个 foreach 但我无法实现。也许我错过了什么,想知道是否有人通过这个:

代码是:

function runXml() {

        $content1 = <<< XML
<data>
    <users>
        <user>
            <name>myName</name>
            <email>myEmail</email>
            <address>MyAddres - City - Country</address>
        </user>
        <user>
            <name>myName2</name>
            <email>myEmail2</email>
            <address>MyAddres2 - City - Country</address>
        </user>
    </users>
</data>
XML;

        $content2 = <<< XML
    <users>
        <user>
            <name>myName</name>
            <email>myEmail</email>
            <address>MyAddres - City - Country</address>
        </user>
        <user>
            <name>myName2</name>
            <email>myEmail2</email>
            <address>MyAddres2 - City - Country</address>
        </user>
    </users>
XML;

        echo '<pre>';
        $xml1 = simplexml_load_string($content1);
        print_r($this->processFeedXmlWithoutAttributes($xml1));

        $xml2 = simplexml_load_string($content2);
        print_r($this->processFeedXmlWithoutAttributes($xml2));

    }

    function processFeedXmlWithoutAttributes($xml)
    {
        $output = array();
        try {
            if($xml->children()) {
                $children = $xml->children();
                if(count($children) > 0) {
                    foreach($children as $child) {
                        $output[] = $child;
                    }
                }
            }
        } catch (Exception $e) {
        }
        return $output;
    }

结果是:

    Array
(
    [0] => SimpleXMLElement Object
        (
            [user] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [name] => myName
                            [email] => myEmail
                            [address] => MyAddres - City - Country
                        )

                    [1] => SimpleXMLElement Object
                        (
                            [name] => myName2
                            [email] => myEmail2
                            [address] => MyAddres2 - City - Country
                        )

                )

        )

)
Array
(
    [0] => SimpleXMLElement Object
        (
            [name] => myName
            [email] => myEmail
            [address] => MyAddres - City - Country
        )

    [1] => SimpleXMLElement Object
        (
            [name] => myName2
            [email] => myEmail2
            [address] => MyAddres2 - City - Country
        )

)

所需的结果是 xml 的两种结构:

Array
(
    [0] => SimpleXMLElement Object
        (
            [name] => myName
            [email] => myEmail
            [address] => MyAddres - City - Country
        )

    [1] => SimpleXMLElement Object
        (
            [name] => myName2
            [email] => myEmail2
            [address] => MyAddres2 - City - Country
        )

)

对于我有“”用户索引的第一个结构被添加并创建了一个多维数组,我们的想法是摆脱该索引并让数组稍后迭代。

感谢任何帮助!

【问题讨论】:

    标签: php arrays xml


    【解决方案1】:

    问题在于user 节点在这两种情况下都应该是根。

    为了实现它 - 你可以从这个节点开始解析 XML。 processFeedXmlWithoutAttributes 方法的可能解决方案:

        function processFeedXmlWithoutAttributes(\SimpleXMLElement $xml): array
        {
            $output = [];
            try {
                while ($xml->getName() !== 'user') {
                    $xml = $xml->children();
                }
                foreach ($xml as $child) {
                    $output[] = $child;
                }
            } catch (Exception $e) {
            }
    
            return $output;
        }
    

    【讨论】:

    • 是的,我明白 :),想法是为两个选项获取相同的递归代码,用户节点名是动态的,我想硬编码节点名,但我不能,因为我有大约 40 个不同节点名称的 xml。
    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2021-04-18
    • 1970-01-01
    • 2010-11-09
    • 2018-06-21
    相关资源
    最近更新 更多