2017-02-26 50 views
1

我尝试检查SimpleXml元素是否为数组。
我在PHP doc上看到了给出的例子here,所以似乎可以检查一个节点是否是一个数组。但就我而言,我做不到。is_array()在SimpleXml数组元素上返回false

一个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

什么是你的PHP版本! – Naincy

+0

@Naincy,我使用PHP7 – 2ndGAB

回答

0

你的基本假设是错误的:

根据$ myElement,$ myElement-> periods->周期可能是一个对象或数组。

->操作者一个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)。但是,再次,当你只有一个代码时,你不需要在你的代码中有任何特殊情况。

+0

我认为你的回答是可以的。无论如何,我的假设并不完全错误。根据我处理的'$ myElement',如果我在'句号'中有2个或更多'period',var_dump会告诉'[“period”] => array(2)',所以有一个**数组**。如果我只有一个'period',那么var_dump表示'[“period”] => object(SimpleXMLElement)'。这是我想说的,这就是为什么我想知道如何使用'is_array()'。但似乎我可以在任何情况下使用'foreach'。谢谢。 – 2ndGAB

+0

@ 2ndGAB'var_dump'告诉你,但它在说谎!在那里没有数组,这只是*调试输出*表示的事实,即有多个具有相同名称的子元素。在底层,只有一堆代表XML文档的非PHP类数据,可以按需访问。 – IMSoP

+0

好的,我明白,非常感谢。 – 2ndGAB