2013-04-14 4 views
0

Цикл while используется для чтения каждой строки файла CSV, кроме первой строки. Однако ни одна из строк не читается, если оператор if используется для игнорирования первой строки. Удаление оператора if позволяет ему читать все строки, как ожидалось. Почему это?Продолжить PHP Пока цикл прерывает его

$rowNumber = 1; 

// Load CSV into array 
$inputFileName = '/var/www/site/data.csv'; 
$file = fopen($inputFileName, 'r'); 

while (($row = fgetcsv($file)) !== FALSE) { 
    // Ignore row #1 (headers) 
    if($rowNumber == 1) 
     continue; 

    doSomeWork(); 

    // Increment row number 
    $rowNumber++; 
} 
fclose($file); 

echo 'Loaded: ' . $rowNumber . ' rows'; 
+0

Почему вы добавили эти теги? – PeeHaa

ответ

4

Не нужно continue. Попробуйте

$rowNumber = 1; 

// Load CSV into array 
$inputFileName = '/var/www/site/data.csv'; 
$file = fopen($inputFileName, 'r'); 

while (($row = fgetcsv($file)) !== FALSE) { 
    // Ignore row #1 (headers) 
    if($rowNumber != 1) 
    { 
    doSomeWork(); 
    } 

    // Increment row number 
    $rowNumber++; 
} 
fclose($file); 

echo 'Loaded: ' . $rowNumber . ' rows'; 

Редактировать

Просто объяснить, почему ваш continue не работает, как вы ожидали. Руководство PHP написано:

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

Это означает, что, когда ваш продолжать называется то ваше заявление $rowNumber++; также пропущен, что означает, что ваш $rowNumber всегда остается 1 и, следовательно, все строки пропускаются :)

+0

+ 2^n для очистки в нижней части ответа :) –

1

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

$rowNumber = 1; 

// Load CSV into array 
$inputFileName = '/var/www/site/data.csv'; 
$file = fopen($inputFileName, 'r'); 

while (($row = fgetcsv($file)) !== FALSE) { 
    // Ignore row #1 (headers) 
    if($rowNumber > 1) {   
     doSomeWork(); 
    } 
    // Increment row number 
    $rowNumber++; 
} 
fclose($file); 

echo 'Loaded: ' . $rowNumber . ' rows'; 

Если $rowNumber больше, чем 1, то будет doSomething(), в противном случае он будет только увеличивать $rowNumber

3

Проблема в том, что вы ударили continue перед тем, как вы увеличиваете число $rowNumber. В результате $rowNumber все еще 1 на следующей итерации, и он снова проскакивает вперед. Попробуйте начать с $ rowNumber = 0 и поместите инкремент в начале цикла, а не в конец.

0

Это связано с тем, что, когда вы продолжаете, вы не увеличиваете число $ rowNumber. Это всегда 1. И когда ваш файл заканчивается, тогда, когда прерывания цикла и файл закрыты.

Смежные вопросы