Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP XML从属性开始数组,然后从数组切片开始_Php_Arrays_Xml - Fatal编程技术网

PHP XML从属性开始数组,然后从数组切片开始

PHP XML从属性开始数组,然后从数组切片开始,php,arrays,xml,Php,Arrays,Xml,目前,我有一个从XML文件创建的数组,然后我用数组_切片来显示数组的最后200个。。。我很确定我在这段代码中有任何错误(注意,我不是从0 bcz开始的,它是一个空节点): 我想做的是能够启动数组@一个属性(节点的),并在它前面显示100。我的意图是使用url属性address.com/blah/index.php#9439580作为start@attribute的值 。。。但经过多次搜索,不确定从何处开始使用数组。不确定是否需要将其分块,或者如何在特定属性处启动数组 使用XML更新示例: <

目前,我有一个从XML文件创建的数组,然后我用数组_切片来显示数组的最后200个。。。我很确定我在这段代码中有任何错误(注意,我不是从0 bcz开始的,它是一个空节点):

我想做的是能够启动数组@一个属性(节点的),并在它前面显示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>

废话
网址
废话
网址

不要为此将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)
    ]
  );
}
Xpath表达式
  • 任何
    项目
    元素节点
    //项目
  • 任何
    元素节点,其
    id
    属性等于
    4

    //项目[@id=4]
  • 。。。它前面的
    节点具有相同的父节点
    //item[@id=4]/前面的兄弟姐妹::item
  • 。。。限于2
    //项[@id=4]/前面的同级::项[position()<3]

Xpath表达式充当过滤器,可以与
|
组合使用。该示例使用第一个表达式筛选标记节点本身,第二个表达式筛选其前面的同级节点。

是否可以包含一个XML示例,显示您希望它如何工作。@NigelRen我包含了XML,但XML不是更改内容。我想要的是通过从特定节点(通过属性)开始,从数组中的某个点(XML数据)打印数组。。。假设XML中有100个节点,我拉数组,但我希望它从unit id=“929495821”开始,只显示下一个100。我的foreach bcz中有array_reserve(),我需要从最新到最旧显示数组。。。我如何将其应用于您的代码?此外,我是否会以与上面相同的方式将每个数组元素转换为值,即$last_data=$arc['data']
DOMXpath::evaluate()
返回一个
DOMNodeList
,您可以使用
迭代器\u to \u array()
将其转换为数组。或者使用
for
-循环向后迭代节点列表。使用DOM函数和Xpath获取单个值
$Xpath->evaluate('string(data)',$item)
就是一个例子。我在多次迭代中都没有得到任何结果。。。你能编辑代码来显示迭代器的位置吗?我不确定它是否会把foreach搞砸。interator_到_数组($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"
}