PHP Simplexml обратный - PullRequest
       7

PHP Simplexml обратный

3 голосов
/ 20 августа 2010

Есть ли способ перебрать xml, загруженный в simpleXML в обратном порядке?скажем, если у меня есть следующий xml

$string ="<items>
    <item>1</item>
    <item>2</item>
    <item>3</item> 
</items>";

$xml = simplexml_load_string($string);

, есть ли способ отменить $ xml, чтобы получить пункт 3, когда я делаю foreach

Ответы [ 6 ]

9 голосов
/ 20 августа 2010

Если предположить, что OP - новичок, заинтересованный только в решении, я бы порекомендовал использовать xpath(), чтобы получить элементы, и array_reverse(), чтобы изменить их порядок:

$items = array_reverse($xml->xpath('item'));

Примечание. XPath-элемент "item" захватывает все элементы <item/>, которые являются прямыми дочерними элементами текущего элемента.

5 голосов
/ 20 августа 2010
$items = $xml->item;
for ($i = count($items) - 1; $i >= 0; $i--)
{
    echo (string) $items[$i].", ";
}
1 голос
/ 07 июня 2012

Это прекрасно работает для меня:

$string = "<items>
<item>1</item>
<item>2</item>
<item>3</item>
</items>";
$xml = simplexml_load_string($string); 
$reverseArray = (array) $xml;
$reverseArray = array_reverse($reverseArray["item"]);
print_r($reverseArray);

Выход:

Array
(
    [0] => 3
    [1] => 2
    [2] => 1
)
1 голос
/ 20 августа 2010

С simplexml:

<?php
$string ="<items>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</items>";

$xml = simplexml_load_string($string);

$length = count($xml->item);
for($i = $length; $i; --$i) {
    echo $xml->item[$i-1];
}

печать:

321

Другой пример:

Это немного многословно и использует более мощный DomDocument и не SimpleXml, если вы действительно хотите;)

<?php
$string ="<items>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</items>";

$oXml = DomDocument::loadXml($string);

$oItems = $oXml->firstChild->childNodes;
$lastItemIndex = $oItems->length;

$oItem = $oItems->item($lastItemIndex-1);
do {
    echo $oItem->nodeValue;
} while($oItem = $oItem->previousSibling);

печать:

3
2
1
0 голосов
/ 20 августа 2010

Поскольку Iterators в PHP не имеют метода стиля previous, краткий ответ - нет. Вы можете прочитать их в массив, а затем перевернуть массив, но это не будет напрямую повторяться в обратном направлении.

Один из вариантов - создать ReverseIterator, где вы оборачиваете обычный итератор, а затем пересекаете его в обратном направлении. Но это может стать проблематичным, поскольку вы не знаете, есть ли у итератора конец (вы можете увидеть некоторые примеры, которые не в SPL ).

Так нет, ты не можешь. Ваш единственный вариант - сделать что-то вроде этого:

$nodes = array();
foreach ($xml AS $node) {
    array_unshift($nodes, $node);
}
0 голосов
/ 20 августа 2010

$xml->item - это массив. Используйте функции сортировки массива.

rsort($xml->item);
print_r($xml->item);

РЕДАКТИРОВАТЬ: Хорошо, нет способа сделать это. Сначала вы должны создать массив.

$myArray = array_reverse((array)$xml->item, true);
print_r($myArray);

(больше не тестировать)

...