is_array()在SimpleXml数组元素上返回false

时间:2017-02-26 12:03:00

标签: php simplexml

我尝试检查SimpleXml元素是否为数组 我在PHP doc上看到了给定的示例here,因此似乎可以检查节点是否是一个数组。但就我而言,我不能这样做。

var_dump($myElement)给了我:

object(SimpleXMLElement)#701 (4) { 
    ["@attributes"]=> array(1) { 
        ["id"]=> string(7) "5831377" 
    } 
    ["openPeriod"]=> string(10) "2016-04-01" 
    ["closePeriod"]=> string(10) "2016-05-31" 
    ["periods"]=> object(SimpleXMLElement)#703 (1) { 
        ["period"]=> array(2) { 
            [0]=> object(SimpleXMLElement)#707 (3) { 
                ["startPeriod"]=> string(8) "10:00:00" 
                ["endPeriod"]=> string(8) "12:30:00" 
                ["weekDays"]=> string(51) "monday,tuesday,wednesday,thursday,friday,saturday,sunday" 
            } 
            [1]=> object(SimpleXMLElement)#702 (3) { 
                ["startPeriod"]=> string(8) "14:00:00" 
                ["endPeriod"]=> string(8) "20:00:00" 
                ["weekDays"]=> string(51) "monday,tuesday,wednesday,thursday,friday,saturday,sunday" 
            } 
        } 
    } 
}

取决于$myElement$myElement->periods->period可以是对象或数组。

但在给定的情况下,debug(is_array($myElement->periods->period))会返回false

你能告诉我为什么吗?

修改
这是原始的XML元素:

<openingPeriod id="5831487">
    <openPeriod>2016-04-01</openPeriod>
    <closePeriod>2016-05-31</closePeriod>
    <periods>
        <period>
            <startPeriod>10:00:00</startPeriod>
            <endPeriod>12:30:00</endPeriod>
            <weekDays>monday,tuesday,wednesday,thursday,friday,saturday,sunday</weekDays>
        </period>
        <period>
            <startPeriod>14:00:00</startPeriod>
            <endPeriod>20:00:00</endPeriod>
            <weekDays>monday,tuesday,wednesday,thursday,friday,saturday,sunday</weekDays>
        </period>
    </periods>
</openingPeriod>

1 个答案:

答案 0 :(得分:1)

你的基本假设是错误的:

  

取决于$ myElement,$ myElement-&gt; periods-&gt;句点可以是对象或数组。

SimpleXMLElement对象上的->运算符的结果是始终另一个SimpleXMLElement对象。我不确定为什么在您链接的页面的评论中有如此多的is_array提及,但我认为他们只是犯了同样的错误。你可能会被var_dumpprint_r愚弄,告诉你那里有一个阵列,但它在撒谎;这就是调试信息如何显示多个具有相同名称的项目。

您可以使用[0]foreach等访问对象,就好像它是一个数组,但这些只是对象的便利功能,而不是实际数组。

如果您查看the official examples,您会发现$myElement->periods->period只是$myElement->periods[0]->period的简称。因此,在大多数情况下,您根本不需要知道是否有多个孩子或只有一个,如果您执行foreach($myElement->periods->period as $period),则循环将始终有效。 SimpleXML为您处理不同的场景。

如果你真正想知道的是特定元素有多少,你可以使用count($myElement->periods->period)。但同样,您的代码中不应该有任何特殊情况,只有一个。