2015-03-02 3 views
2

Я использую этот код для создания разделенных точкой с запятой файла:PHP разделенных точкой с запятой генерации файлов

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

Что я хочу:

enter image description here

(данные разделенные точкой с запятой и строк разделенные newLine)

Что я понимаю: enter image description here (Данные разделяются точкой с запятой, но новые строки не добавляются, все данные отображаются в строке sngle)

Пожалуйста, скажите мне, что я делаю неправильно ..

+0

Использование ''
и не '\ г \ n'. Кроме того, вы можете использовать '$ i ++' вместо '$ i = $ i + 1'. – Albzi

+0

Используйте [fputcsv()] (http://php.net/manual/en/function.fputcsv.php) вместо этого сломанного доморощенного; и использовать правильные заголовки, чтобы выход обрабатывался как csv, а не как html markup –

ответ

1

Ваша проблема в вашей логике. Вы продолжаете добавлять данные к вашему $ dataArray с каждой итерацией, в то время как следующий оператор в вашем коде будет устанавливать stingData для вложенного значения $ 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"; 
?> 
+0

Darn, как я мог пропустить такой качественный шаг здесь :) Спасибо человеку! – user3202144

0

Использование 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); 
0

Для создания файла 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); 
Смежные вопросы