【问题标题】:PHP: simplexml_load_string() force arrayPHP: simplexml_load_string() 强制数组
【发布时间】:2013-10-11 13:59:58
【问题描述】:

有谁知道我是否可以强制 SimpleXMLElement 变量始终为数组?

<result>
    <item>
        <id>1</id>
        <name>name 1</name>
    </item>
    <item>
        <id>2</id>
        <name>name 2</name>
    </item>
</result>

通过 simplexml_load_string() 解析上述 XML 时,我得到以下对象

SimpleXMLElement Object
(
    [item] => Array
    (
        [0] => SimpleXMLElement Object
            (
                [id] => 1
                [name] => name 1
            )
        [1] => SimpleXMLElement Object
             (
                [id] => 2
                [name] => name 2
            )
    )
)

这很棒,因为我可以遍历“项目”并获取单个对象。但是当 item 是单个条目时,如下所示,我得到一个不同的对象结构,它破坏了我的循环,因为我开始循环通过“id”和“name”而不是对象。

<result>
    <item>
        <id>1</id>
        <name>name 1</name>
    </item>
</result>

SimpleXMLElement Object
(
    [item] => SimpleXMLElement Object
    (
           [id] => 1
           [name] => name 1    
    )

)

到底有没有强制“item”成为一个带有 simplexml_load_string() 的数组或通过重新构造 XML?

【问题讨论】:

    标签: php xml arrays


    【解决方案1】:

    你不需要把它作为一个数组,一个简单的检查就可以了。喜欢

    if(is_array($xml->result->item))
    {
        //loop here
    }
    else
    {
        //only one object
    }
    

    此外,无论是一个元素还是多个元素,一个单独的 foreach 都可以完成工作。例如

    <?php
    $string="
    <result>
        <item>
            <id>1</id>
            <name>name 1</name>
        </item>
    
    </result>";
    
    $xml = simplexml_load_string($string);
    
    //print_r($xml);
    
    
    foreach($xml->item as $item)
    {
    echo $item->id."\n";
    }
    ?>
    

    这也适用于多个项目。见小提琴

    Fiddle

    【讨论】:

    • 我在一些代码中已经有了该解决方案,但这意味着我要么自己将单个“项目”设置为数组,要么在 if 语句中复制代码
    • 哇不知道 foreach 会对单个对象做出这样的反应。我认为 foreach 至少会发出警告,因为它试图循环遍历不是数组的东西。感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多