Цикл PHP do-while не работает

Итак, я застрял в этом цикле do-while, который не работал около двух часов. Я действительно не понимаю, почему это не работает. Я получаю эту ошибку:

Notice: Undefined offset: 9 in /public_html/me/yes.php on line 60

Единственная проблема, о которой я думаю, заключается в том, что он не принимает циклы while в режиме do-while.

Вот мой рабочий код только для внутреннего цикла while:

$maxcols = $numofcols-1; //=9
$maxrow = count($myarray)-1; //=44
$currentcol=0;
    $currentrow=1;
    //do {
    $collection->insert(array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
    $currentcol++;
    while ($currentcol<=$maxcols){
    $newdata = array('$set' => array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
    $currentcol--;
    $collection->update(array($title[$currentcol] => $myarray[$currentrow][$currentcol]), $newdata);
    $currentcol++;
    $currentcol++;

    }
    $currentrow++;

    //} while ($currentrow<=$maxrow);

Если я раскомментирую две строки "//do {" и "//} while ($currentrow‹=$maxrow);" моя программа умирает с ошибкой, о которой я упоминал выше. Есть ли что-то очень простое в том, почему это нарушает мой код? заранее спасибо

ОБНОВЛЕНИЕ:

Строка 60:

$collection->insert(array($title[$currentcol] => $myarray[$currentrow][$currentcol]));


person EGHDK    schedule 02.04.2012    source источник
comment
Что такое строка № 60 в приведенном выше коде? И уведомление, которое вы разместили выше, не должно приводить к умиранию программы.   -  person Salman A    schedule 02.04.2012
comment
Это самая первая строка после оператора do{. Извиняюсь!   -  person EGHDK    schedule 02.04.2012
comment
@SalmanA Очевидный вопрос ... Это то, что я собирался задать себе ...   -  person Dr.Kameleon    schedule 02.04.2012
comment
сколько названий в массиве $title?   -  person Dr.Kameleon    schedule 02.04.2012
comment
всего 9. Массив идет от $title[0]-$title[8]   -  person EGHDK    schedule 02.04.2012
comment
Что ж, сообщение об ошибке говорит о том, что вы пытаетесь получить $title[9], которого, как вы только что сказали, НЕ существует... Как насчет того, чтобы попытаться увидеть, что не так с вашей переменной currentCol.... Может быть, просто добавить проверку if ($currentCol<9) { тогда и только потом делай... что дальше...   -  person Dr.Kameleon    schedule 02.04.2012
comment
Вы когда-нибудь слышали о foreach? Это похоже на С++ способ обработки массивов. Взгляните на это.   -  person Shoe    schedule 02.04.2012


Ответы (4)


Внутренний цикл while заканчивается установкой $currentcol на $maxcols. В следующий раз, когда вы туда доберетесь, $currentcol будет увеличено на единицу (в предыдущей строке), так что это будет $maxcols+1, поэтому цикл while не запустится. Следующий цикл во внешнем цикле do теперь пытается получить доступ к $title[ $maxcols+1 ], который не определен.

person JJJ    schedule 02.04.2012

$currentrow инициализируется значением 1. Если ваш массив содержит только один элемент, он имеет индекс 0, поэтому вы получаете ошибку «индекс вне границ».

Кроме того, вы определяете количество столбцов один раз глобально (вне цикла while для строк). Возможно, вам следует определить количество столбцов для каждой строки непосредственно перед тем, как вы перебираете столбцы.

Кроме того, вы не сбрасываете переменную индекса столбца на 0, вы просто продолжаете увеличивать. Что вызывает ошибку во второй строке, поскольку вы начинаете с несуществующего индекса столбца.

Подозревать, что PHP не позволяет использовать цикл while внутри цикла while, бессмысленно. Вложенные циклы используются очень часто — вам просто нужно правильно выполнить условие

person Thorsten Dittmar    schedule 02.04.2012

Попробуйте это:

$maxcols = $numofcols-1; //=9
$maxrow = count($myarray)-1; //=44
$currentcol=0;
$currentrow=1;
do {
    if ($currentcol<9)
    {
         $collection->insert(array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
         $currentcol++;
         while ($currentcol<=$maxcols){
             $newdata = array('$set' => array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
             $currentcol--;
             $collection->update(array($title[$currentcol] => $myarray[$currentrow][$currentcol]), $newdata);
             $currentcol++;
             $currentcol++;
         }
         $currentrow++;
    }

} while ($currentrow<=$maxrow);
person Dr.Kameleon    schedule 02.04.2012
comment
Это избавляет от сообщения об ошибке, но я очень сомневаюсь, что скрипт будет работать так, как этого хочет OP. - person JJJ; 02.04.2012
comment
@Juhana Я тоже не уверен в этом, потому что кажется, что в коде просто какая-то логическая ошибка. Но давайте просто посмотрим... - person Dr.Kameleon; 02.04.2012

Ответ:

Такая простая маленькая ошибка, а сброса на $currentcol не было

Перемещение инициализации прямо под оператором do заставило его работать правильно. Можете ли вы сказать, что уже поздно? хахаха всем спасибо.

$currentrow=1;

do {
$currentcol=0;

$collection->insert(array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
$currentcol++;
while ($currentcol<=$maxcols){
$newdata = array('$set' => array($title[$currentcol] => $myarray[$currentrow][$currentcol]));
$currentcol--;
$collection->update(array($title[$currentcol] => $myarray[$currentrow][$currentcol]), $newdata);
$currentcol++;
$currentcol++;

}
$currentrow++;

} while ($currentrow<=$maxrow);
person EGHDK    schedule 02.04.2012