В настоящее время у меня есть массив, созданный из файла XML, затем я array_slice, чтобы показать последние 200 из массива ... что я почти уверен, что я ошибаюсь в этом коде в любом случае (обратите внимание, что я не начинаю с 0 bcz, это пустой узел ):
$xml_get = 'filename.xml'
$xml_array = json_decode(json_encode($xml_get), 1);
$master = $xml_array['unit'];
// Show Last 200
$master = array_slice($master, 1, 200);
foreach(array_reverse($master) as $arc)
{
$last_id = $arc['@attributes']['id'];
$last_data = $arc['data'];
$last_link = $arc['link'];
// Do stuff with values...
}
Что я хотел бы сделать, так это иметь возможность запускать массив @ атрибут (узла) и показывать 100 перед ним. Я намерен использовать атрибут url: address.com/blah/index.php#9439580 в качестве значения для начального @attribute ...
... но после долгих поисков не уверен, с чего начать с массива. Не уверен, нужно ли мне разбить его на части или как запустить массив с определенным атрибутом.
Обновление с помощью образца XML:
<archive>
<unit id = "929495820">
<data>Blah</data>
<link>url</link>
</unit>
<unit id = "929495821">
<data>Blah</data>
<link>url</link>
</unit>
</archive>
@NigelRen Я включил XML, но XML не менял. Я хочу напечатать массив из определенной точки в массиве (данные XML), начав с определенного узла (через атрибут) ... так, скажем, в XML есть 100 узлов, я вытаскиваю массив, но я хотите, чтобы он начинался с unit id = "929495821" и отображал только следующие 100.






Не конвертируйте для этого XML в JSON. Вы теряете возможность использовать Xpath.
$xml = <<<'XML'
<list>
<item id = "1"><data>One</data></item>
<item id = "2"><data>Two</data></item>
<item id = "3"><data>Three</data></item>
<item id = "4"><data>Four</data></item>
<item id = "5"><data>Five</data></item>
<item id = "6"><data>Six</data></item>
</list>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = '//item[@id=4]|//item[@id=4]/preceding-sibling::item[position() < 3]';
foreach ($xpath->evaluate($expression) as $item) {
var_dump(
[
'id' => $item->getAttribute('id'),
'data' => $xpath->evaluate('string(data)', $item)
]
);
}
Выход:
array(2) {
["id"]=>
string(1) "2"
["data"]=>
string(3) "Two"
}
array(2) {
["id"]=>
string(1) "3"
["data"]=>
string(5) "Three"
}
array(2) {
["id"]=>
string(1) "4"
["data"]=>
string(4) "Four"
}
item//itemitem с атрибутом id, равным 4 ... //item[@id = 4]item с тем же родителем ... //item[@id = 4]/preceding-sibling::item//item[@id = 4]/preceding-sibling::item[position() < 3]Выражения Xpath действуют как фильтры и могут быть объединены с |. В примере первое выражение используется для фильтрации самого узла маркера, а второе - для его предыдущих братьев и сестер.
У меня есть array_reserve () в моем foreach bcz. Мне нужно отобразить массив от новейшего до самого старого ... как мне применить это к вашему коду? Кроме того, могу ли я преобразовать каждый элемент массива в значение так же, как указано выше, т.е. $ last_data = $ arc ['data'];
DOMXpath::evaluate() возвращает DOMNodeList, вы можете преобразовать его в массив с помощью iterator_to_array(). Или вы используете цикл for для перебора списка узлов в обратном направлении. Используйте функции DOM и Xpath для получения отдельных значений. Примером для этого является $xpath->evaluate('string(data)', $item).
Я получаю нулевые результаты в многочисленных итерациях ... можете ли вы отредактировать код, чтобы показать, где будет идти iterator_to_array () bcz Я не уверен, что это портит foreach. interator_to_array ($ xpath)?
Можете ли вы включить образец вашего XML, который показывает, как вы хотите, чтобы он работал.