Для цикла, отображающего одну и ту же строку

#php #laravel #laravel-8

#php #ларавель #laravel-8

Вопрос:

Я пытаюсь поместить строку Excel в массив.

Итак, у меня так: я использую цикл foreach для перебора файла Excel, а затем использую цикл for, который перебирает и проверяет значение для меня и выполняет некоторую проверку.

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

Вот мой код

     $col = $sheet->getHighestDataColumn();
    $row = $sheet->getHighestDataRow();
    $rowCount = $sheet->getHighestDataRow();
    $allRows = $sheet->rangeToArray("A1:{$col}{$row}", null, false);

    $arr = [];

    foreach($allRows as $row)
    {
        for($x = 0; $x <= $rowCount; $x  )
        {
            if($x == 0 || $x == 1) continue;

            $col1 = $sheet->getCell("D$x")->getValue();
            $col2 = $sheet->getCell("E$x")->getValue();
            $col3 = $sheet->getCell("F$x")->getValue();
            $col4 = $sheet->getCell("G$x")->getValue();
            $total = $sheet->getCell("H$x")->getValue();

            $testTotal = $col1   $col2   $col3   $col4;
            if($testTotal === $total)
            {
                echo "<PRE>";
                echo print_r($row);
                echo "</PRE>";
        
                $arr[] = $row;
            }
        }
    }
 

Ответ №1:

Вы получаете первую строку, напечатанную несколько раз, потому что вы печатаете ее в цикле for, который сам находится в цикле foreach .

Вам не нужно выполнять проверку в цикле foreach, потому что проверка не использует $row .

Выполните проверку снаружи, а затем перейдите к использованию $allRows

 $col = $sheet->getHighestDataColumn();
$row = $sheet->getHighestDataRow();
$rowCount = $sheet->getHighestDataRow();
$allRows = $sheet->rangeToArray("A1:{$col}{$row}", null, false);

$validatedRowCount = 0;

//Do the validation
for($x = 0; $x <= $rowCount; $x  )
{
    if($x == 0 || $x == 1) continue;

    $col1 = $sheet->getCell("D$x")->getValue();
    $col2 = $sheet->getCell("E$x")->getValue();
    $col3 = $sheet->getCell("F$x")->getValue();
    $col4 = $sheet->getCell("G$x")->getValue();
    $total = $sheet->getCell("H$x")->getValue();

    $testTotal = $col1   $col2   $col3   $col4;

    $validatedRowCount = $testTotal === $total 
        ? $validatedRowCount   1 
        : $validatedRowCount;            
}

if($validatedRowCount === $rowCount) {
//Safe to assume that $allRows contains validated data
//Proceed to use $allRows
}
 

Или, если вы хотите проверить каждую строку и отфильтровать каждую отдельную строку с помощью проверки, тогда

 
$col = $sheet->getHighestDataColumn();
$row = $sheet->getHighestDataRow();
$rowCount = $sheet->getHighestDataRow();
$allRows = $sheet->rangeToArray("A1:{$col}{$row}", null, false);

$validatedRows = [];

foreach($allRows as $index => $row)
{
    $col1 = $sheet->getCell("D$index")->getValue();
    $col2 = $sheet->getCell("E$index")->getValue();
    $col3 = $sheet->getCell("F$index")->getValue();
    $col4 = $sheet->getCell("G$index")->getValue();
    $total = $sheet->getCell("H$index")->getValue();

    $testTotal = $col1   $col2   $col3   $col4;

    if($testTotal === $total) {
         echo "<PRE>";
         echo print_r($row);
         echo "</PRE>";
        $validatedRows[] = $row;
    }
}