2012-01-23 138 views
0

當解釋器到達$ pDB-> AddLine(5,「Test」)時,它停止響應! 它會返回以下錯誤「致命錯誤:超過30秒的最大執行時間在... 21行」我錯過了什麼嗎?我應該使用array_push()嗎?將項目添加到數組中

<?php 
    class pDb{ 
     protected $m_pArray; 
     public function __construct($arr){ 
      $this->m_pArray = $arr; 
     } 
     public function RemoveLine($index){ // Todo 
     } 
     public function ReplaceLine($index,$input){ 
      if(!$this->m_pArray)return -1; 
      $temp = array(); 
      for($i=0;$i<count($this->m_pArray);$i++){ 
       ($i == $index) ? $temp[$i] = $input : $temp[$i] = $this->m_pArray[$i]; 
      } 
      $this->m_pArray = $temp; 
     } 
     public function AddLine($index,$input){ 
      if(!$this->m_pArray)return -1; 
      $temp = array(); 
      for($i=0;$i<count($this->m_pArray);$i++){ 
       if($i == $index) { $temp[$i] = $input;$i = $i-1; }else{ $temp[$i] = $this->m_pArray[$i]; } 
      } 
      $this->m_pArray = $temp; 
     } 
     public function Get(){ if($this->m_pArray)return $this->m_pArray; return null;} 
     public function GetLine($i){ if($this->m_pArray)return $this->m_pArray[$i]; return null;} 
    } 

    $file = file("db.ini"); 
    for($i=0;$i<count($file);$i++){ 
     echo $i.": | ".$file[$i]."<br/>"; 
    } 

    echo "<br/>===================================================================================================================<br/><br/>"; 

    $pDB = new Pdb($file); 
    #$pDB->ReplaceLine(5,"Test"); // Works!!! 
    $pDB->AddLine(5,"Test"); // Crash!!! 
    for($i=0;$i<count($pDB->Get());$i++){ 
     echo $i.": | ".$pDB->GetLine($i)."<br/>"; 
    } 
?> 

修復: 變化

for($i=0;$i<count($this->m_pArray);$i++){ 
       if($i == $index) { $temp[$i] = $input;$i = $i-1; }else{ $temp[$i] = $this->m_pArray[$i]; } 
      } 

 $done=0; 
     for($i=0;$i<count($this->m_pArray)+1;$i++){ 
      if($i == $index && $done!=1){ $temp[$index] = $input; $done=1;}elseif($done == 1){ $temp[$i] = $this->m_pArray[$i-1]; }else{ $temp[$i] = $this->m_pArray[$i]; } 
     } 

回答

4

考慮你的代碼...

for($i=0;$i<count($this->m_pArray);$i++) { 
    if($i == $index) { 
    $temp[$i] = $input; 
    $i = $i-1; 
    } else { 
    $temp[$i] = $this->m_pArray[$i]; 
    } 
} 

如果$i == $index,然後你立刻減一$i,然後再次循環。這增加了一個到$i,使它等於$index再次,你陷入了同樣的情況 - 永遠!您可能需要將環路條件與if分支中更改的內容(即$temp)相關聯,或者完全更改此處的邏輯。

+0

你是對的!我不敢相信我錯過了! –

1

在我看來,在這一行中的最後一條語句for循環的「AddLine」的問題是:

if($i == $index) { $temp[$i] = $input;$i = $i-1; } 

只要$ i達到5(從函數調用$指數),你總是減少$ i,只是讓它在循環中再次增加,因此永遠不會再繼續。無限循環 - >超時。