Я использую этот код для создания файла с разделителями точкой с запятой:
for ($i = 0; $i < 3; $i = $i+1)
{
array_push($dataArray,"$dataCell1","$dataCell2","$dataCell3","$dataCell4","$dataCell5","$dataCell6","$dataCell7","$dataCell8","$dataCell9","$dataCell10","$dataCell11");
$stringData = rtrim(implode(';', $dataArray), ';'); //rtrim will prevent the last cell to be imploded by ';'
$stringData .= "\r\n";
}
Что я хочу это:
(Данные разделяются точкой с запятой, а строки — новой строкой)
Что я получаю это:
(Данные разделяются точкой с запятой, но новые строки не добавляются, все данные отображаются в виде строки sngle)
Пожалуйста, скажите мне, что я делаю не так ..
Ваша проблема в вашей логике. Вы продолжаете добавлять данные к вашему $ dataArray с каждой итерацией, в то время как следующий оператор в вашем коде установит stingData в значение imploded $ dataArray. ТОЛЬКО В ПОСЛЕДНЕЙ ПЕТЛЯ. И в этот момент $ dataArray содержит все значения данных, потому что вы продолжали нажимать на него в течение 3 итераций.
$stringData = rtrim(...)
Что вы хотите сделать, это:
<?php
//concatenation string
$stringData = '';
for ($i = 0; $i < 3; $i = $i+1)
{
//init the array with every iteration.
$dataArray = array();
//push your values
array_push($dataArray,"$dataCell1","$dataCell2","$dataCell3","$dataCell4","$dataCell5","$dataCell6","$dataCell7","$dataCell8","$dataCell9","$dataCell10","$dataCell11");
//concatenate
$stringData .= rtrim(implode(';', $dataArray), ';');
//new line
$stringData .= "\r\n";
}
//print
echo $stringData . "\n";
?>
использование fputcsv
вместо:
// indexed array of data
$data = [
['col1' => 1, 'col2' => 2, 'col3' => 3],
['col1' => 6, 'col2' => 7, 'col3' => 9],
['col1' => 5, 'col2' => 8, 'col3' => 15],
]
// add headers for each column in the CSV download
array_unshift($data, array_keys(reset($data)));
$handle = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($handle, $row, ';', '"');
}
fclose($handle);
Для создания CSV-файла, fputcsv
это действительно лучший метод.
Сначала начните с сохранения ваших данных в «массиве массивов». Это облегчает обработку данных:
$dataArray = array();
for ($i = 0; $i < 3; $i = $i+1)
$dataArray[$i] = array($dataCell1,$dataCell2,$dataCell3,$dataCell4,$dataCell5,$dataCell6,$dataCell7,$dataCell8,$dataCell9,$dataCell10,$dataCell11);
Затем нам нужно создать дескриптор временного файла, а также убедиться, что у нас есть права для этого. Затем мы сохраним все записи массива во временном файле с правильным разделителем.
$handle = fopen('php://temp', 'r+');
foreach($dataArray as $line)
fputcsv($handle, $line, ';', '"');
rewind($handle);
Если вы просто хотите распечатать результаты на странице, подойдет следующий код:
$contents = "";
while(!feof($handle))
$contents .= fread($handle, 8192);
fclose($handle);
echo $contents;
Помните, что в простом html разрывы строк не отображаются. Однако если вы проверите исходный код полученной страницы, вы увидите разрывы строк.
Но если вы также хотите сохранить значения в загружаемом CSV-файле, вам понадобится следующий код:
$fileName = "file.csv";
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $fileName . '";');
fpassthru($handle);
fclose($handle);