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