2011-09-21 76 views
1

我繼承了一些PHP代碼(但我有點PHP經驗)並且找不到如何計算返回的對象中的某些元素simplexml_load_file()PHP如何計算xml元素返回的對象simplexml_load_file(),

的代碼是這樣的

$xml = simplexml_load_file($feed); 
for ($x=0; $x<6; $x++) { 
    $title = $xml->channel[0]->item[$x]->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
} 

它假定會有至少6個<item>元素,但有時也有減少,所以我得到警告的輸出消息對我的開發系統(雖然不是直播)。

如何在$xml->channel[0]中提取計數爲<item>的元素?

回答

2

這裏有幾種選擇,從我最到最不喜歡(的那些提供)。

  • 一種選擇是利用SimpleXMLIterator的結合LimitIterator

    $xml = simplexml_load_file($feed, 'SimpleXMLIterator'); 
    $items = new LimitIterator($xml->channel->item, 0, 6); 
    foreach ($items as $item) { 
        echo "<li>{$item->title}</li>\n"; 
    } 
    
  • 如果看起來太嚇人了,還是沒有夠嚇人的,然後又是拋出的XPath進入組合。

    $xml = simplexml_load_file($feed); 
    $items = $xml->xpath('/rss/channel/item[position() <= 6]'); 
    foreach ($items as $item) { 
        echo "<li>{$item->title}</li>\n"; 
    } 
    
  • 最後,幾乎沒有改變你現有的代碼,也有。

    $xml = simplexml_load_file($feed); 
    for ($x=0; $x<6; $x++) { 
        // Break out of loop if no more items 
        if (!isset($xml->channel[0]->item[$x])) { 
         break; 
        } 
        $title = $xml->channel[0]->item[$x]->title[0]; 
        echo "<li>" . $title . "</li>\n"; 
    } 
    
1

您可以通過計數($ xml)來計數。 我總是做這樣的:

$xml = simplexml_load_file($feed); 
foreach($xml as $key => $one_row) { 
     echo $one_row->some_xml_chield; 
    } 
+0

行,但圖6是用於顯示一個上限,我想我可以使用'如果$計數++> = 6 {打破;循環內部。 – RedGrittyBrick

+0

是的,你可以:) – tasmaniski

+0

嘿,我只是找到函數** simpleXMLToArray ** 那裏[鏈接](http://php.net/manual/en/book.simplexml.php)。 您可以將xml對象傳遞給此函數並獲取數組,並且您可以通過爲($ i = 0; $ i> ...){...}傳遞throw元素 – tasmaniski

2

最簡單的方法是使用SimpleXMLElement::count()爲:

$xml = simplexml_load_file($feed); 
$num = $xml->channel[0]->count(); 
for ($x=0; $x<$num; $x++) { 
    $title = $xml->channel[0]->item[$x]->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
} 

還要指出的是$xml->channel[0]回報是SimpleXMLElement對象。此類實現Traversable接口,所以我們可以在一個foreach環直接使用它:

$xml = simplexml_load_file($feed); 
foreach($xml->channel[0] as $item { 
    $title = $item->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
}