2016-04-30 116 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++;} 

也许有点咯咯,但它会完成工作。