Получение массива из объекта с помощью SimpleXMLElement


У меня возникли некоторые проблемы с получением массива в этих объектах. Когда я печатаю_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:

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

Отправляется следующий ответ:

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

Как мне получить значение [0] или я делаю это неправильно? и есть ли способ зациклить результаты и получить ключи объектов?

Я пытался повторить $id[0], но это не возвращает результата.

Author: hakre, 2012-12-22

3 answers

Когда вы используете print_r на SimpleXMLElement, между ними возникает магия. Так что то, что вы видите, на самом деле не то, что есть. Это информативно, но просто не так, как с обычными объектами или массивами.

Чтобы ответить на ваш вопрос, как выполнить итерацию:

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));
 4
Author: hakre, 2012-12-22 02:54:23

Вы можете привести объект 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.

 1
Author: Ja͢ck, 2017-05-23 11:56:41

Вам просто нужно обновить свой foreach следующим образом:

foreach($message_object->data->id as $key => $value) {
    print_r($value);
}
 0
Author: PhearOfRayne, 2012-12-22 02:46:45