【问题标题】:Getting an array from object using SimpleXMLElement使用 SimpleXMLElement 从对象中获取数组
【发布时间】:2012-12-22 01:57:17
【问题描述】:

我在获取这些对象中的数组时遇到了一些问题。当我 print_r() 时,会打印以下代码。 $message_object 是对象的名称。

SimpleXMLElement Object
(
    [header] => SimpleXMLElement Object
        (
            [responsetime] => 2012-12-22T14:10:09+00:00
        )

    [data] => SimpleXMLElement Object
        (
            [id] => Array
                (
                    [0] => 65233
                    [1] => 65234
                )

            [account] => Array
                (
                    [0] => 20992
                    [1] => 20992
                )

            [shortcode] => Array
                (
                    [0] => 3255
                    [1] => 3255
                )

            [received] => Array
                (
                    [0] => 2012-12-22T11:04:30+00:00
                    [1] => 2012-12-22T11:31:08+00:00
                )

            [from] => Array
                (
                    [0] => 6121843347
                    [1] => 6121820166
                )

            [cnt] => Array
                (
                    [0] => 24
                    [1] => 25
                )

            [message] => Array
                (
                    [0] => Go tramping wellington 11-30
                    [1] => Go drinking Matakana 2pm
                )

        )

)

我正在尝试使用 foreach 从对象中获取 id 数组:

foreach($message_object->data->id AS $id) {
    print_r($id);
}

发送如下回复:

SimpleXMLElement Object ( [0] => 65233 ) SimpleXMLElement Object ( [0] => 65234 )

我如何获得 [0] 的值,或者我是不是搞错了?有没有办法循环遍历结果并获取对象键?

我尝试回显 $id[0],但没有返回任何结果。

【问题讨论】:

  • 先尝试循环:foreach($message_object AS $k=>$val) 然后你应该可以添加一个 if 语句来检查 $k = 0。
  • 您是否尝试只回显 $id 而不是 $id[0]?
  • 当我 print_r($id) 它给了我 SimpleXMLElement 对象 ( [0] => 65233 ) 所以理论上 $id[0] 应该 = 65233。

标签: php xml simplexml


【解决方案1】:

当您在 SimpleXMLElement 上使用 print_r 时,两者之间会出现魔法。所以你看到的并不是实际存在的。它提供了丰富的信息,但与普通对象或数组不同。

回答你的问题如何迭代:

foreach ($message_object->data->id as $id)
{
    echo $id, "\n";
}

回答如何将它们转换为数组:

$ids = iterator_to_array($message_object->data->id, 0);

因为这仍然会给您SimpleXMLElements,但您可能希望拥有可以在使用时将每个元素转换为字符串的值,例如:

echo (string) $ids[1]; # output second id 65234

或将整个数组转换为字符串:

$ids = array_map('strval', iterator_to_array($message_object->data->id, 0));

或者转换成整数:

$ids = array_map('intval', iterator_to_array($message_object->data->id, 0));

【讨论】:

    【解决方案2】:

    您可以像这样转换 SimpleXMLElement 对象:

    foreach ($message_object->data->id AS $id) {
        echo (string)$id, PHP_EOL;
        echo (int)$id, PHP_EOL; // should work too
    
        // hakre told me that this will work too ;-)
        echo $id, PHP_EOL;
    }
    

    或者全部投射:

    $ids = array_map('intval', $message_object->data->id);
    print_r($ids);
    

    更新

    好的,上面的array_map 代码实际上并不能正常工作,因为它不是严格意义上的数组,您应该先应用iterator_to_array($message_object->data_id, false)

    $ids = array_map('intval', iterator_to_array$message_object->data->id, false));
    

    另请参阅:@hakre's answer

    【讨论】:

    • $message_object->data->id 不是一个数组,所以array_map 会抱怨这一点。先用iterator_to_array这里没有键,看我的回答stackoverflow.com/a/13999675/367456
    【解决方案3】:

    您只需要像这样更新您的 foreach:

    foreach($message_object->data->id as $key => $value) {
        print_r($value);
    }
    

    【讨论】:

    • $value then = SimpleXMLElement Object ( [0] => 65233 ) SimpleXMLElement Object ( [0] => 65234 ) 我试图从对象 echo $value[ 中获取值 [0] 0];返回空
    • @Philip:是的,因为[0] 是虚拟的。 print_r 在这里有点愚弄你,因为 SimpleXMLElement 的魔法很特别。看我的回答stackoverflow.com/a/13999675/367456
    • @hakre 你扩展了我对 SimpleXMLElement 的了解。谢谢。
    猜你喜欢
    • 2011-02-21
    • 2010-12-31
    • 2015-11-28
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多