0

When the interpreter reaches $pDB->AddLine(5,"Test") it stops responding! It returns the following error "Fatal error: Maximum execution time of 30 seconds exceeded in ... on line 21" Am I missing something? Should I use array_push() instead?

<?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/>";
    }
?>

Fix : Change

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]; }
            }

to

        $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]; }
        }
0

2 Answers 2

4

Consider your code...

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];
  }
}

If $i == $index, then you promptly subtract one from $i, and go around the loop again. This adds one to $i, making it equal to $index again, and you fall into the same case - forever! You either need to tie your loop condition to something you change in the if branch (i.e. $temp), or change the logic here completely.

Sign up to request clarification or add additional context in comments.

Comments

1

It seems to me that the last statement in this line in the for-loop of "AddLine" is the problem:

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

As soon as $i reaches 5 (the $index from the function call), you always decrease $i, only to have it increased again by the loop, therefore never proceeding any further. Infinite loop -> timeout.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.