группировать строки на основе столбца из импортированного файла CSV

У меня есть файл 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

если возможно, я хочу сделать это без использования базы данных

0

Решение

$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...
}
0

Другие решения

Итак, ваша задача в цикле — взять массив, предоставленный $ 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) {}
0