PHP XML启动数组在属性然后阵列切片

时间:2018-06-09 00:27:55

标签: php arrays xml

目前有一个从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作为start @attribute的值......

...但经过多次搜索,不确定从哪里开始使用数组。不确定我是否需要对其进行分块或如何在特定属性处启动数组。

使用XML示例进行更新:

<archive>
  <unit id="929495820">
    <data>Blah</data>
    <link>url</link>
  </unit>
  <unit id="929495821">
    <data>Blah</data>
    <link>url</link>
  </unit>
</archive>

1 个答案:

答案 0 :(得分:0)

不要将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表达式充当过滤器,可以与|结合使用。该示例使用第一个表达式来过滤标记节点本身,第二个表达式用于过滤其前一个兄弟节点。