Получение массива из объекта с помощью 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], но это не возвращает результата.
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));
Вы можете привести объект 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.
Вам просто нужно обновить свой foreach следующим образом:
foreach($message_object->data->id as $key => $value) {
print_r($value);
}