【问题标题】:Is there "array_search"-like function for a simplexml objectsimplexml 对象是否有类似“array_search”的函数
【发布时间】:2012-05-14 23:15:41
【问题描述】:

我有一个 codeigniter 应用程序,它查询一个 api 并获取一个 simplexml 对象。我从 simplexml 对象中硬编码了我想要的值,但后来发现对象的结构并不总是相同,所以我不能使用强制转换来获取我需要的值。

是否有类似 array_search 的函数可供我使用,以便我可以使用“classid”来获取值?以下是 simplexml 对象的示例:

    [Package] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [ID] => e981b9a72cd305c7d97cc530ef9b3015
            )

        [Postage] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [CLASSID] => 3
                            )

                        [MailService] => Express Mail<sup>&reg;</sup>
                        [Rate] => 57.60
                    )

                [1] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [CLASSID] => 2
                            )

                        [MailService] => Express Mail<sup>&reg;</sup> Hold For Pickup
                        [Rate] => 57.60
                    )

                [2] => SimpleXMLElement Object
                    (
                        [@attributes] => Array
                            (
                                [CLASSID] => 55
                            )

                        [MailService] => Express Mail<sup>&reg;</sup> Flat Rate Boxes
                        [Rate] => 39.95
                    )

我用它来获取 [Rate] 值:

$usps->Package->Postage[0]->Rate

问题是我需要使用 [CLASSID],因为这与数字键 (?) 中的数据发生变化的地方是一致的。

【问题讨论】:

  • 您能发布用于生成该输出的 XML 吗?
  • XPath 可能就是你所追求的
  • 谢谢 tandu,你是对的!我能够得到我想要的: $usps->xpath('//Postage[@CLASSID="3"]');
  • @tandu 您应该将其发布为答案,我在阅读 XML 文档时几乎只使用 Xpath。

标签: php codeigniter simplexml


【解决方案1】:

使用XPath

你不仅可以搜索特定元素,还可以使用各种坐标轴进行各种疯狂的搜索。

【讨论】:

  • @tandu 在之前的评论中回答了这个问题 - 谢谢 tandu,你是对的!我能够得到我想要的: $usps->xpath('//Postage[@CLASSID="3"]');
【解决方案2】:

这应该可以,但如果没有原始 XML,我无法对其进行测试:

$rates = array();

foreach ($usps->Package->Postage as $postage)
    $rates[$postage->attributes()->CLASSID] = $postage->Rate;

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多