我正在做一个rss阅读器:
..
..
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$x=$xmlDoc->getElementsByTagName('item');
for ($i=$j=0; $i<=5; $i++) {
$item_title=$x->item($i)->getElementsByTagName('title')
->item(0)->nodeValue;
..
..
}
我将数字限制为等于 5,但某些 xml 包含的项目少于 5 个,因此出现错误
Fatal error: Call to a member function getElementsByTagName() on a non-object
我可以做$ilength但由于图像负载过重,我必须限制数量。如何解决上述错误?
因此,循环基于 5 和项目数。
不确定语法,但使用 JS 将是
for ($i=$j=0; $i<=5 && $i<$x.length ; $i++) {
尝试将代码更改为:
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$x=$xmlDoc->getElementsByTagName('item');
$ct = ( count($x)<=5 ) ? count($x) : 5;
for ($i=$j=0; $i<=$ct; $i++) {
for ($i=$j=0; $i<=5; $i++) {
..
..
$xmlDoc = new DOMDocument();
if ($xmlDoc->load($xml)) { // do the stuffs if file is loaded
$x=$xmlDoc->getElementsByTagName('item');
$item_title=$x->item($i)->getElementsByTagName('title')
->item(0)->nodeValue;
..
..
}
}
编辑:
if(is_object($x->item($i))) { // check if the loaded item is object.
$item_title=$x->item($i)->getElementsByTagName('title')
->item(0)->nodeValue;
}
您希望 5 作为最大索引:
$m = 5;
for ($i = 0; $i <= $m; $i++) { ...
但仅当它大于结果中的元素数减去 1 时$x
:
$m = min(5, $x->length);
有关方便的min()
功能的更详细描述,请参阅 http://php.net/min。
除此之外,在这里使用foreach
和限制迭代器通常要容易得多:
$items = $xmlDoc->getElementsByTagName('item');
$limited = new LimitIterator(new IteratorIterator($items), 0, 5);
foreach ($limited as $item) {
# ... just operate on $item ...
}
循环中不会再有任何无效$item
。您的代码可能会变得更富有表现力,更易于阅读和修改。