访问对象属性(在没有数组转换的情况下向下钻取)[重复]
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)
优秀。我一定会检查文档,我也有一本书要读。这些只是让我感到困惑的几件事。感谢您的所有帮助,这对我有很大帮助,非常感谢。以上是关于访问对象属性(在没有数组转换的情况下向下钻取)[重复]的主要内容,如果未能解决你的问题,请参考以下文章