«При знаке» @ в объекте SimpleXML?

Это результат работы print_r() на обычном объекте SimpleXMLElement:

 SimpleXMLElement Object ( [@attributes] => Array ( ) ) 

Что означает этот знак?

Это объект SimpleXMLElement . Строка «@attributes» является внутренним представлением атрибутов из элемента XML. Используйте функции SimpleXML для получения данных с этого объекта, а не для непосредственного взаимодействия с ним.

Все эти ответы об ошибках неверны. @ Ничего не значит. Вот как свойство называется внутренне, но не полагайтесь на это . Не полагайтесь на print_r() или var_dump() при работе с SimpleXML. SimpleXML выполняет множество «магических» вещей, которые неправильно представлены print_r() и var_dump() .

Если вам нужно знать, что внутри «фрагмента XML», просто используйте ->asXML() .

Извините, не могу комментировать как гость, но для тех, кто заканчивается здесь, как я … Я создаю свои собственные поля формы Joomla, и Joomla создает очень «интересный» объект из всех видов вещей. Теперь, я не хотел становиться экспертом SimpleXML, все, что я хотел, было оригинальным текстом ярлыка, который был пропущен в @attributes.

После немного "hmmm, I wonder if this works?"™ Я нашел, что это самый простой способ доступа к этим значениям:

 var_dump($simpleXMLObject); /* Result */ object(SimpleXMLElement) public '@attributes' => array (size=3) 'name' => string 'awesome' 'label' => string 'Awesome Label' 'type' => string 'typeOfAwesome' echo $simpleXMLObject->attributes()->label; // Awesome Label $simpleXMLObject->attributes()->label = 'Different Day, Different Awesome'; echo $simpleXMLObject->attributes()->label; // Different Day, Different Awesome 

Они не лгали. Это действительно просто.

У меня недостаточно ответов, чтобы прокомментировать user3098738 … но хотелось проверить его ответ. Это действительно настолько просто. Каждый раз, когда вы запускаете @ атрибуты в SimpleXML … используйте

 $simpleXMLObject->attributes() $simpleXMLObject->key->attributes() 

Я работаю с API HTTP, который выдает только данные в формате XML. Поэтому сначала я загрузил его в SimpleXML и был также озадачен проблемой @attributes .. как я могу получить ценные данные, которые он содержит? print_r () меня смутило.

Мое решение состояло в том, чтобы создать массив и переменную итератора в 0. Прокрутите объект SimpleXML с помощью foreach и получите данные с помощью метода attributes () и загрузите его в мой созданный массив. Итерация перед концом цикла foreach.

Итак, print_r () проигнорировал это:

 SimpleXMLElement Object ( [@attributes] => Array ( [ID] => 1 [First] => John [Last] => Smith ) ) 

Для более удобного нормального массива. Это здорово, потому что мне нужен вариант быстрого преобразования массива в json, если это необходимо.

Мое решение в коде:

 $obj = simplexml_load_string($apiXmlData); $fugly = $obj->Deeply->Nested->XML->Data->Names; $people = array(); $i = 0; foreach($fugly as $val) { $people[$i]['id'] += $val->attributes()->ID; $people[$i]['first'] = "". $val->attributes()->First; $people[$i]['last'] = "". $val->attributes()->Last; $i++; } Во- $obj = simplexml_load_string($apiXmlData); $fugly = $obj->Deeply->Nested->XML->Data->Names; $people = array(); $i = 0; foreach($fugly as $val) { $people[$i]['id'] += $val->attributes()->ID; $people[$i]['first'] = "". $val->attributes()->First; $people[$i]['last'] = "". $val->attributes()->Last; $i++; } 

Быстрое примечание: функция settype () PHP является странной / багги, поэтому я добавил +, чтобы убедиться, что идентификатор является целым числом и добавил кавычки, чтобы убедиться, что имя является строкой . Если нет какого-либо преобразования переменных, вы собираетесь загружать объекты SimpleXML в созданный массив.

Конечный результат print_r ():

 Array ( [0] => Array ( [id] => 1 [first] => John [last] => Smith ) [1] => Array ( [id] => 2 [first] => Jane [last] => Doe ) )