0

just wondering why the following code doesn't itterate through
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 ?>

But the following code does 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
} ?>
  • 1
    The return value from `getElementsByTagName()` is a `DOMNodeList` __object__, not an `array`; it's `Traversable`, so `foreach` will work, but `array_walk()` requires an actual array argument – Mark Baker Oct 05 '15 at 14:49
  • @MarkBaker that's the answer ... – Bart Friederichs Oct 05 '15 at 14:49
  • 1
    @MarkBaker it's funny that `array_walk` doesn't generate an error when called with a non-array, no? – Bobby Jack Oct 05 '15 at 14:55
  • From the PHP docs: `Returns TRUE on success or FALSE on failure.`, but it will also give a warning if you have error logging enabled - [Demo](https://3v4l.org/lguWH) – Mark Baker Oct 05 '15 at 15:01
  • @MarkBaker can u add this as the answer. I would like to accept that as an answer. Allthough i expected PHP to generate an error, but it doest. (maybe should have read the php manual better for array_walk) :) – Mark Teunissen Oct 05 '15 at 15:03

1 Answers1

0

The return value from getElementsByTagName() is a DOMNodeList object, not an array: a DOMNodeList object is Traversable, so a foreach() will iterate over it; but array_walk() requires an actual array argument, so it can't be used with array_walk().

Calling array_walk() with an argument that isn't an array won't generate an Error, but it will generate a Warning, and it will return a result of boolean false.

Mark Baker
  • 209,507
  • 32
  • 346
  • 385
  • Thanks, as Paul Crovella did say array_walk **can** iterate over object properties, thats why i tried array_walk. – Mark Teunissen Oct 05 '15 at 21:09
  • Interesting observation @PaulCrovella, that's a new one on me.... interesting to see that it's still in PHP7, but not in HHVM – Mark Baker Oct 05 '15 at 21:18