2016-04-30 122 views
-1

是否可以限制此循環?僅限於四個循環?如何將foreach循環限制爲四個循環

我在另一篇文章這個來源,它的工作,但我只是需要限制循環

 $scraper = new DOMScraper(); 
     $scraper->setSite('http://anywebsite.com/testig12.aspx')->setSource(); 
     Class DOMScraper extends DOMDocument{ 
     public $site; 
     private $source; 
     private $dom; 

    function __construct(){ 
    libxml_use_internal_errors(true); 
    $this->preserveWhiteSpace = false; 
    $this->strictErrorChecking = false; 
} 

function setSite($site){ 
    $this->site = $site; 
    return $this; 
} 

function setSource(){ 
    if(empty($this->site))return 'Error: Missing $this->site, 
    use setSite() first'; 
    $this->source = $this->get_data($this->site); 
    return $this; 
} 

function getInnerHTML($tag, $id=null, $nodeValue = false){ 
    if(empty($this->site))return 'Error: Missing $this->source, 
    use setSource() first'; 
    $this->loadHTML($this->source); 
    $tmp = $this->getElementsByTagName($tag); 
    $ret = null; 
    foreach ($tmp as $v){ 
     if($id !== null){ 
      $attr = explode('=',$id); 
      if($v->getAttribute($attr[0])==$attr[1]){ 
       if($nodeValue == true){ 
        $ret .= trim($v->nodeValue); 
       }else{ 
        $ret .= $this->innerHTML($v); 
       } 
      } 
     }else{ 
      if($nodeValue == true){ 
       $ret .= trim($v->nodeValue); 
      }else{ 
       $ret .= $this->innerHTML($v); 
      } 
     } 
    } 
    return $ret; 
} 

function innerHTML($dom){ 
    $ret = ""; 
    $nodes = $dom->childNodes; 
    foreach($nodes as $v){ 
     $tmp = new DOMDocument(); 
     $tmp->appendChild($tmp->importNode($v, true)); 
     $ret .= trim($tmp->saveHTML()); 
    } 
    return $ret; 
} 

    function get_data($url){ 
    if(function_exists('curl_init')){ 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $data = curl_exec($ch); 
     curl_close($ch); 
     return $data; 
    }else{ 
     return file_get_contents($url); 
    } 
} 
    } 
    ?> 

那麼這裏就是我想限制becouse不是從網站,如報廢的所有數據顯示2000條記錄..我想只加載最新的4

<?php echo '<div>'.$scraper->getInnerHTML('div','id=LeftDiv12').'</div>'; ?> 

謝謝

+1

你應該使用for循環而不是foreach循環;)。 – Unex

+0

你能否更好地解釋我?感謝您的重播 – Ray

+0

^這不是每次都適合。使varialbe每循環增加,並在達到所需值時中斷 – splash58

回答

2

只需使用一個虛擬計數變量是這樣的:

$Count = 0; 
foreach($Array as $Key => $Value){ 
    //your code 

    $Count++; 
    if ($Count == 4){ 
     break; //stop foreach loop after 4th loop 
    } 
} 
+0

現在它的工作謝謝:) – Ray

0

您可以用來限制foreach循環的一種方法是在foreach循環之外創建一個變量,並在每次循環運行時向變量添加一個變量。然後在一定次數後跳出循環。我修改了你的函數來完成我上面描述的內容。

function getInnerHTML($tag, $id=null, $nodeValue = false){ 
    if(empty($this->site))return 'Error: Missing $this->source, 
    use setSource() first'; 
    $this->loadHTML($this->source); 
    $tmp = $this->getElementsByTagName($tag); 
    $ret = null; 
    $i = 0; 
    foreach ($tmp as $v){ 
     if($id !== null){ 
      $attr = explode('=',$id); 
      if($v->getAttribute($attr[0])==$attr[1]){ 
       if($nodeValue == true){ 
        $ret .= trim($v->nodeValue); 
       }else{ 
        $ret .= $this->innerHTML($v); 
       } 
      } 
     }else{ 
      if($nodeValue == true){ 
       $ret .= trim($v->nodeValue); 
      }else{ 
       $ret .= $this->innerHTML($v); 
      } 
     } 
     if(++$i > 4) break; 
    } 
    return $ret; 
} 
+0

感謝您的幫助的人,但我不知道爲什麼會出現空白頁後,我用你的代碼 – Ray

+0

@Ray這意味着有跡象表明曾在他們沒有4個內容div的編輯,可以嘗試設置它到100,看看是否有任何東西出現。您是否在使用包含內容的網址? – Flibio

0

不確定您指的是哪個循環,但您可以在循環外部創建計數器,然後在循環內增加計數器。包括if語句以在計數器上突破> = 4

$counter = 0; 
foreach($nodes as $v){ 
if($counter>=4){ 
    break; 
} 
$tmp = new DOMDocument(); 
$tmp->appendChild($tmp->importNode($v, true)); 
$ret .= trim($tmp->saveHTML()); 
$counter++;} 

也許有點咯咯,但它會完成工作。