2015-10-05 2 views
0

просто интересно, почему следующий код не itterate через
DOMDocument :: getElementsByTagNamePHP Почему array_walk не работает с 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 
} ?> 
+1

Возвращаемое значение из 'getElementsByTagName()' является 'DOMNodeList' __объектом__, а не' array'; это 'Traversable', поэтому' foreach' будет работать, но 'array_walk()' требует фактического аргумента массива –

+0

@MarkBaker, это ответ ... –

+1

@MarkBaker смешно, что 'array_walk' не генерирует ошибку при вызове с не-массив, нет? –

ответ

0

возвращаемое значение из getElementsByTagName() является DOMNodeListобъект, а не массив: a DOMNodeList объект Traversable, поэтому foreach() будет перебирать его; но array_walk() требует фактического аргумент массива, поэтому он не может использоваться с array_walk().

Вызов array_walk() с аргументом, который не является массивом, не будет генерировать ошибку, но он будет генерировать предупреждение, и он вернет результат с булевым false.

+0

Спасибо, как сказал Пол Кровелла. array_walk ** может ** перебирать свойства объекта, вот почему я попробовал array_walk. –

+0

Интересное наблюдение @PaulCrovella, это новый на меня .... интересно видеть, что он все еще находится в PHP7, но не в HHVM –