将项添加到数组中

时间:2012-01-23 13:51:39

标签: php arrays

当解释器达到$ pDB-> AddLine(5,“Test”)时,它会停止响应! 它返回以下错误“致命错误:第21行超过30秒的最大执行时间”我错过了什么?我应该使用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]; }
        }

2 个答案:

答案 0 :(得分: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)联系起来,或者完全更改逻辑。

答案 1 :(得分:1)

在我看来,在“AddLine”的for循环中这行中的最后一个语句是问题所在:

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

一旦$ i达到5(来自函数调用的$ index),你总是减少$ i,只是让它在循环中再次增加,因此永远不再继续。无限循环 - &gt;超时。