Intereting Posts
Должен ли я использовать mysqli_real_escape_string или использовать подготовленные инструкции? jQuery-скрипт плагина wordpress не работает в содержимом, загруженном через ajax Abs () – проблема с функцией абсолютного значения в PHP API-интерфейс PayPal REST, возвращающий 500-серверную ошибку для маркера кредитной карты Вычисление новых значений массива на основе другого числового массива Многомерный массив PHP x HasOffers Я хочу изменить значение другой ячейки таблицы при изменении значения первой ячейки Разделение даты и времени на дату и значение времени PHP – Внедрить механизм журналирования для работы в нескольких классах Функция PHP crypt на разных ОС Codeigniter AutoLoad DB, но есть возможность проверить, существует ли соединение Проверка, если запрос отправлен обратно в PHP PHP создать PDF-счет PDO PHP bindValue не работает Magento программно добавляет изображение продукта

Почему SimpleXML меняет мой массив на первый элемент массива, когда я его использую?

Вот мой код:

$string = <<<XML <?xml version='1.0'?> <test> <testing> <lol>hello</lol> <lol>there</lol> </testing> </test> XML; $xml = simplexml_load_string($string); echo "All of the XML:\n"; print_r $xml; echo "\n\nJust the 'lol' array:"; print_r $xml->testing->lol; 

Вывод:

 All of the XML: SimpleXMLElement Object ( [testing] => SimpleXMLElement Object ( [lol] => Array ( [0] => hello [1] => there ) ) ) Just the 'lol' array: SimpleXMLElement Object ( [0] => hello ) 

Почему он выводит только [0] вместо всего массива? Я не понимаю.

Это потому, что у вас есть два элемента LOL. Чтобы получить доступ ко второму, вам нужно сделать следующее:

 $xml->testing->lol[1]; 

это даст вам "там"

 $xml->testing->lol[0]; 

Дает вам «привет»

Метод children () элемента SimpleXMLElement даст вам объект, содержащий все дочерние элементы элемента, например:

 $xml->testing->children(); 

предоставит вам объект, содержащий все дочерние элементы «тестирования» SimpleXMLElement.

Если вам нужно выполнить итерацию, вы можете использовать следующий код:

 foreach($xml->testing->children() as $ele) { var_dump($ele); } 

Более подробная информация о SimpleXMLElement приведена здесь:

http://www.php.net/manual/en/class.simplexmlelement.php

То, что предложил @Yottatron, верно, но совсем не так, как показывает этот пример:

если ваш XML будет выглядеть так:

 <?xml version='1.0'?> <testing> <lol> <lolelem>Lol1</lolelem> <lolelem>Lol2</lolelem> <notlol>NotLol1</lolelem> <notlol>NotLol1</lolelem> </lol> </testing> 

Вывод Simplexml будет:

 SimpleXMLElement Object ( [lol] => SimpleXMLElement Object ( [lolelem] => Array ( [0] => Lol1 [1] => Lol2 ) [notlol] => Array ( [0] => NotLol1 [1] => NotLol1 ) ) ) 

и путем написания

 $xml->lol->lolelem 

вы ожидаете, что ваш результат будет

 Array ( [0] => Lol1 [1] => Lol2 ) 

но вместо этого вы получите:

 SimpleXMLElement Object ( [0] => Lol1 ) 

и

 $xml->lol->children() 

вы получите:

 SimpleXMLElement Object ( [lolelem] => Array ( [0] => Lol1 [1] => Lol2 ) [notlol] => Array ( [0] => NotLol1 [1] => NotLol1 ) ) 

Что вам нужно сделать, если вы хотите только лолелема:

 $xml->xpath("//lol/lolelem") 

Это дает этот результат (не как ожидаемая форма, но содержит правильные элементы)

 Array ( [0] => SimpleXMLElement Object ( [0] => Lol1 ) [1] => SimpleXMLElement Object ( [0] => Lol2 ) ) 

то, что вы можете сделать, это использовать кодирование / декодирование Json

 $jsonArray = Json_decode(Json_encode($xml), true); 

С помощью истинного аргумента вы можете вызывать вместо использования -> use [name]

поэтому примером может служить:

 $xml = file("someXmlFile.xml"); $jsonArray = Json_decode(Json_encode($xml), true); foreach(jsonArray['title'] as $title){ Do something with $titles } 

если у вас более одного элемента, это типично помещается в @attributes, если элементы имеют атрибуты. Этому можно противопоставить: $title = $title['@attributes']

Надеюсь, это поможет.

Ах, да, я помню, как простой XML почти справился с этой проблемой массивов синтаксического анализа. Попробуйте приведенный ниже код. Он предоставит вам массив элементов LOL или, если вы только что получили один элемент LOL, он вернет это в массив.

Главным преимуществом этого является то, что вы можете сделать что-то вроде foreach ($ lol as $ element), и оно все равно будет работать на одном (или на 0) элементе LOL.

 <?php $string = <<<XML <?xml version='1.0'?> <test> <testing> <lol>hello</lol> <lol>there</lol> </testing> </test> XML; $xml = simplexml_load_string($string); echo "<pre>"; echo "All of the XML:\n"; print_r($xml); echo "\n\nJust the 'lol' array:\n"; $test_lols = $xml->testing->children(); $childcount = count($test_lols); if ($childcount < 2) { $lol = array($test_lols->lol); } else { $lol = (array) $test_lols; $lol = $lol['lol']; } print_r($lol); ?> 

Иди в этот вопрос …

Xpath может быть немного медленным, поэтому вы можете добиться такого же эффекта с помощью простого цикла.

 for ($i = 0; $i < count($xml->testing->lol); $i++) { print_r($xml->testing->lol[$i]); }