【问题标题】:PHP XML Start Array at Attribute then Array SlicePHP XML 在属性处开始数组,然后是数组切片
【发布时间】:2018-06-09 00:27:54
【问题描述】:

目前有一个从 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 示例,说明您希望它如何工作。
  • @NigelRen 我包含了 XML,但 XML 不是变化。我想要的是通过从特定节点(通过属性)开始从数组中的某个点(XML数据)打印数组......所以说XML中有100个节点,我拉数组但我希望它从单元 id="929495821" 开始并仅显示接下来的 100 个。

标签: php arrays xml


【解决方案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
  • 任何具有id 属性的item 元素节点等于4...
    //item[@id = 4]
  • ...其前面的item 具有相同父节点的节点...
    //item[@id = 4]/preceding-sibling::item
  • ... 限制为 2 个 ...
    //item[@id = 4]/preceding-sibling::item[position() &lt; 3]

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

【讨论】:

  • 我的 foreach bcz 中有 array_reserve() 我需要显示从最新到最旧的数组......我如何将它应用到您的代码中?另外,我是否会以与上面相同的方式将每个数组元素转换为值,即 $last_data = $arc['data'];
  • DOMXpath::evaluate() 返回一个DOMNodeList,您可以使用iterator_to_array() 将其转换为数组。或者您使用for-loop 向后迭代节点列表。使用 DOM 函数和 Xpath 获取单个值 $xpath-&gt;evaluate('string(data)', $item) 就是一个例子。
  • 我在无数次迭代中得到零结果......你能编辑代码以显示 iterator_to_array() 将去哪里 bcz 我不确定它是否搞砸了 foreach。 interator_to_array($xpath)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2023-03-07
  • 2012-11-10
  • 2022-07-07
  • 1970-01-01
  • 2020-08-24
  • 2019-01-08
相关资源
最近更新 更多