У меня есть файл CSV, в котором много строк, например:
Клиент Продукт Количество Единица Сумма Итого
1 Prod1 1 10 10
1 Prod2 2 15 30
2 Prod1 2 12 24
2 Prod2 1 5 5
так далее…
Я хочу иметь возможность импортировать файл CSV с использованием PHP и группировать каждого клиента вместе и отображать общую стоимость для каждого клиента.
У меня есть функция импорта и т.д …
if(is_uploaded_file($_FILES['file']['tmp_name'])) {
echo "<h3>" . "File ". $_FILES['file']['name'] ." uploaded successfully." . "</h3><br><br>";
}
$handle = fopen($_FILES['file']['tmp_name'], "r");
fgetcsv($handle);
//then loop through each row
while(($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
}
но я не уверен, что делать внутри цикла while
если возможно, я хочу сделать это без использования базы данных
$clients = array();
while(($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if(!array_key_exists($data[0],$clients))
$clients[$data[0]] = array();
array_push($clients[$data[0]],$data);
}//then loop over each client in your array
foreach($clients as $clientId => $clientEntries)
{
// combine or print records...
}
Итак, ваша задача в цикле — взять массив, предоставленный $ data, и преобразовать его в пригодный для использования массив, который использует идентификатор клиента в качестве ключа и общую стоимость в качестве значения. Моя реализация будет выглядеть следующим образом:
$customerTotals = array();
while ($data = fgetcsv($handle, 1000, ',')) {
$currentTotal = isset($customerTotals[$data[0]]) ? intval($customerTotals[$data[0]]) : 0;
$addedTotal = intval($data[2]) * intval($data[4]);
$customerTotals[$data[0]] = $currentTotal + $addedTotal;
}
Обратите внимание, что приведенный выше код не выполняет никакой проверки работоспособности. Пустая строка или пропущенные столбцы приведут к непредвиденным ошибкам. Он помещает первый столбец, идентификатор клиента, в качестве ключа массива, и умножает 3-й и 5-й столбцы вместе на количество и цену соответственно.
Теперь вы можете перебрать этот массив так:
foreach ($customerTotals as $customerId => $total) {}