PHP XML Start Array at Attribute, затем Array Slice

В настоящее время у меня есть массив, созданный из файла 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>

Можете ли вы включить образец вашего XML, который показывает, как вы хотите, чтобы он работал.

Nigel Ren 09.06.2018 14:45

@NigelRen Я включил XML, но XML не менял. Я хочу напечатать массив из определенной точки в массиве (данные XML), начав с определенного узла (через атрибут) ... так, скажем, в XML есть 100 узлов, я вытаскиваю массив, но я хотите, чтобы он начинался с unit id = "929495821" и отображал только следующие 100.

Vimmy 09.06.2018 20:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
125
1

Ответы 1

Не конвертируйте для этого 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"
}

Выражение Xpath

  • Любой элемент узла item
    //item
  • Любой узел элемента item с атрибутом id, равным 4 ...
    //item[@id = 4]
  • ... его предыдущие узлы item с тем же родителем ...
    //item[@id = 4]/preceding-sibling::item
  • ... ограничено 2 ...
    //item[@id = 4]/preceding-sibling::item[position() < 3]

Выражения Xpath действуют как фильтры и могут быть объединены с |. В примере первое выражение используется для фильтрации самого узла маркера, а второе - для его предыдущих братьев и сестер.

У меня есть array_reserve () в моем foreach bcz. Мне нужно отобразить массив от новейшего до самого старого ... как мне применить это к вашему коду? Кроме того, могу ли я преобразовать каждый элемент массива в значение так же, как указано выше, т.е. $ last_data = $ arc ['data'];

Vimmy 10.06.2018 22:43
DOMXpath::evaluate() возвращает DOMNodeList, вы можете преобразовать его в массив с помощью iterator_to_array(). Или вы используете цикл for для перебора списка узлов в обратном направлении. Используйте функции DOM и Xpath для получения отдельных значений. Примером для этого является $xpath->evaluate('string(data)', $item).
ThW 11.06.2018 21:31

Я получаю нулевые результаты в многочисленных итерациях ... можете ли вы отредактировать код, чтобы показать, где будет идти iterator_to_array () bcz Я не уверен, что это портит foreach. interator_to_array ($ xpath)?

Vimmy 12.06.2018 23:24

Другие вопросы по теме