【问题标题】:PHP Why does array_walk not work with DOMDocument::getElementsByTagNamePHP 为什么 array_walk 不能与 DOMDocument::getElementsByTagName 一起使用
【发布时间】:2015-10-05 14:44:28
【问题描述】:

只是想知道为什么下面的代码没有迭代
DOMDocument::getElementsByTagName

<?php
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML('<html><head>...blablabla...</html>');
$elements = $dom->getElementsByTagName('div');
array_walk($elements, 'var_dump'); // doesn't work ?>

但以下代码确实工作:

<?php
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML('<html><head>...blablabla...</html>');
$elements = $dom->getElementsByTagName('div');
foreach($elements as $element) {
  var_dump($element); // does work
} ?>

【问题讨论】:

  • getElementsByTagName() 的返回值是DOMNodeList object,而不是array;它是Traversable,所以foreach 可以工作,但array_walk() 需要一个实际的数组参数
  • @MarkBaker 这就是答案...
  • @MarkBaker 有趣的是array_walk 在使用非数组调用时不会产生错误,不是吗?
  • 来自 PHP 文档:Returns TRUE on success or FALSE on failure.,但如果您启用了错误日志记录,它也会发出警告 - Demo
  • @MarkBaker 你可以添加这个作为答案。我愿意接受这个作为答案。尽管我希望 PHP 会产生错误,但它确实如此。 (也许应该更好地阅读 array_walk 的 php 手册):)

标签: php domdocument array-walk


【解决方案1】:

getElementsByTagName() 的返回值是 DOMNodeList 对象,而不是数组:DOMNodeList 对象是 Traversable,所以 foreach() 将遍历它;但array_walk() 需要一个实际 数组参数,因此它不能与array_walk() 一起使用。

使用不是数组的参数调用 array_walk() 不会产生错误,但会产生警告,并且会返回布尔值 false

【讨论】:

  • 谢谢,正如 Paul Crovella 所说,array_walk 可以迭代对象属性,这就是我尝试 array_walk 的原因。
  • 有趣的观察@PaulCrovella,这对我来说是一个新的....有趣的是,它仍在 PHP7 中,但不在 HHVM 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多