我尝试检查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>
答案 0 :(得分:1)
你的基本假设是错误的:
取决于$ myElement,$ myElement-&gt; periods-&gt;句点可以是对象或数组。
SimpleXMLElement对象上的->
运算符的结果是始终另一个SimpleXMLElement对象。我不确定为什么在您链接的页面的评论中有如此多的is_array
提及,但我认为他们只是犯了同样的错误。你可能会被var_dump
或print_r
愚弄,告诉你那里有一个阵列,但它在撒谎;这就是调试信息如何显示多个具有相同名称的项目。
您可以使用[0]
,foreach
等访问对象,就好像它是一个数组,但这些只是对象的便利功能,而不是实际数组。
如果您查看the official examples,您会发现$myElement->periods->period
只是$myElement->periods[0]->period
的简称。因此,在大多数情况下,您根本不需要知道是否有多个孩子或只有一个,如果您执行foreach($myElement->periods->period as $period)
,则循环将始终有效。 SimpleXML为您处理不同的场景。
如果你真正想知道的是特定元素有多少,你可以使用count($myElement->periods->period)
。但同样,您的代码中不应该有任何特殊情况,只有一个。