访问对象属性(在没有数组转换的情况下向下钻取)[重复]

Posted

技术标签:

【中文标题】访问对象属性(在没有数组转换的情况下向下钻取)[重复]【英文标题】:Accessing Object Properties (Drilling down without array conversion) [duplicate] 【发布时间】:2014-01-12 16:19:40 【问题描述】:

我最近一直在使用生成电视指南 xml 文件的 tv_grab_uk_rt。我编写了一个脚本来将 XML 转换为一个对象,我可以循环并插入到数据库中。虽然我的脚本工作正常,但我遇到了一个我希望得到澄清的问题。

将 XML 放入对象时,我得到以下信息:

SimpleXMLElement Object
(
[@attributes] => Array
    (
        [date] => Mon, 23 Dec 2013 04:30:01 GMT
        [source-info-url] => http://www.radiotimes.com
        [source-info-name] => Radio Times XMLTV Service
        [source-data-url] => http://xmltv.radiotimes.com/xmltv/channels.dat
        [generator-info-name] => XMLTV/0.5.61, tv_grab_uk_rt 1.342, 2011/06/19 06:50:36 
        [generator-info-url] => http://www.xmltv.org
    )

[channel] => Array
    (
        [0] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [id] => fiver.channel5.co.uk
                    )

                [display-name] => 5*
                [icon] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [src] => http://www.lyngsat-logo.com/logo/tv/cc/channel5_star.jpg
                            )

                    )

            )
    )
)

假设这个对象包含在变量$xml 中,如果我要执行以下操作:

foreach($xml->channel as $channel)

  echo $channel->displayname

我意识到我可以回显displayname 的对象属性,在本例中为5*

但是如果我想说回显src 在这种情况下http://www.lyngsat-logo.com/logo/tv/cc/channel5_star.jpg 会发生什么,我将如何处理一个对象。例如,我不能这样做

foreach($xml->channel as $channel)

  echo $channel->icon->@attributes->src

以数组为例,您可以轻松做到

foreach($xml['channel'] as $channel)

  echo $channel['icon']['@attributes']['src'];

但不是对象。我发现我可以将对象转换为这样的数组,而不是陷入无限循环

 foreach($xml->channel as $channel)

  echo $channel['icon']['@attributes']['src'];
  $channelArray = get_object_vars($channel);

然后我可以简单地以数组的形式访问属性。 所以我的问题真的是,在不将对象转换为数组的情况下,有没有办法钻入属性,即

$xml->channel->0->displayname

【问题讨论】:

您可以使用数组访问 ($element['src']) 在 SimpleXML 中访问 XML 属性,@attribute 只是装饰性的,并且不是您误解的对象的属性它。这在 php 手册中有很好的解释:Basic SimpleXML usage 【参考方案1】:

每个channel 都是一个SimpleXMLElement 实例,因此您可以

foreach($xml->channel as $channel)

  echo $channel->icon->attributes()->src;

如有疑问,请始终从官方文档开始。

【讨论】:

好的,现在@attributes 成为attributes() 很有意义。您能否详细说明(如果频道有多个元素),我将如何访问说第二个对象,即channel[1] 哦,抱歉,我指的是您的foreach 中的$channel。更新了答案。但是,是的,您也可以使用$xml->channel[1] 没问题我发现通过这样做$xml->channel[9]->attributes()->id我能够得到想要的结果。最后一个问题。 displayname 实际上是 display-name (为了清楚起见,我改变了这个问题)。当我说$channel->display-name 时,由于名称中的连字符,这似乎不起作用。我该怎么办? 您可以使用$channel->'display-name'。 (docs.php.net/manual/en/language.variables.variable.php) 优秀。我一定会检查文档,我也有一本书要读。这些只是让我感到困惑的几件事。感谢您的所有帮助,这对我有很大帮助,非常感谢。

以上是关于访问对象属性(在没有数组转换的情况下向下钻取)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

BI 仪表板向下钻取的最佳方式

如何在不向下转换的情况下调用派生类的成员函数

ASP 图表、年、月、日向下钻取

使用 Ramda 在特定条件下添加对象属性值

在没有 Q_PROPERTY 定义的情况下从 C++ 访问 QML 对象的属性

子报表在 Matrix 上未按预期工作,具有向下钻取功能