Ich versuche, eine Reihe von Produkten in eine CSV-Datei zu konvertieren, aber es scheint nicht nach Plan zu verlaufen. Die CSV-Datei ist eine lange Zeile, hier ist mein Code:
for($i=0;$i<count($prods);$i++) {
$sql = "SELECT * FROM products WHERE id = '".$prods[$i]."'";
$result = $mysqli->query($sql);
$info = $result->fetch_array();
}
$header = '';
for($i=0;$i<count($info);$i++)
{
$row = $info[$i];
$line = '';
for($b=0;$b<count($row);$b++)
{
$value = $row[$b];
if ( ( !isset( $value ) ) || ( $value == "" ) )
{
$value = "\t";
}
else
{
$value = str_replace( '"' , '""' , $value );
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );
if ( $data == "" )
{
$data = "\n(0) Records Found!\n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");
array_to_CSV($data);
function array_to_CSV($data)
{
$outstream = fopen("php://output", 'r+');
fputcsv($outstream, $data, ',', '"');
rewind($outstream);
$csv = fgets($outstream);
fclose($outstream);
return $csv;
}
Außerdem erzwingt der Header keinen Download. Ich habe die Ausgabe kopiert und eingefügt und als .csv gespeichert
BEARBEITEN
PROBLEM GELÖST:
Wenn jemand anderes nach dem gleichen suchte, fand er einen besseren Weg, dies zu tun:
$num = 0;
$sql = "SELECT id, name, description FROM products";
if($result = $mysqli->query($sql)) {
while($p = $result->fetch_array()) {
$prod[$num]['id'] = $p['id'];
$prod[$num]['name'] = $p['name'];
$prod[$num]['description'] = $p['description'];
$num++;
}
}
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv");
header("Content-Disposition:attachment;filename=pressurecsv.csv");
fputcsv($output, array('id','name','description'));
foreach($prod as $product) {
fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");
Antworten:
Anstatt Werte aufzuschreiben, sollten Sie die Verwendung in Betracht ziehen
fputcsv()
.Dies kann Ihr Problem sofort lösen.
quelle
Dies ist eine einfache Lösung, die ein Array in eine CSV-Zeichenfolge exportiert:
quelle
Versuchen Sie es mit;
So beenden Sie jede neue Zeile in Ihrer CSV-Ausgabe.
Ich gehe davon aus, dass der Text begrenzt ist, aber nicht in die nächste Zeile wechselt.
Das ist eine PHP-Konstante. Es bestimmt das richtige Zeilenende, das Sie benötigen.
Windows verwendet beispielsweise "\ r \ n". Ich habe mir damit den Kopf zerbrochen, als meine Ausgabe nicht in eine neue Zeile überging.
Wie schreibe ich eine einheitliche neue Zeile in PHP?
quelle
Ich weiß, dass dies alt ist. Ich hatte einen Fall, in dem der Array-Schlüssel auch in der CSV enthalten sein musste. Deshalb habe ich das Skript von Jesse Q aktualisiert, um dies zu tun. Ich habe einen String als Ausgabe verwendet, da implode keine neue Zeile hinzufügen kann (neue Zeile habe ich hinzugefügt und sollte wirklich vorhanden sein).
Bitte beachten Sie, dass dies nur mit einwertigen Arrays funktioniert
(key, value)
. könnte aber leicht aktualisiert werden, um mehrdimensional zu handhaben(key, array())
.quelle
In meinem Fall war mein Array mehrdimensional, möglicherweise mit Arrays als Werten. Also habe ich diese rekursive Funktion erstellt, um das Array vollständig zu sprengen:
Da sich die verschiedenen Ebenen meines Arrays nicht gut für das flache CSV-Format eignen, habe ich eine leere Spalte mit dem Schlüssel des Sub-Arrays erstellt, um als beschreibendes "Intro" für die nächste Datenebene zu dienen. Beispielausgabe:
Sie könnten diese "beschreibende" "Intro" -Spalte leicht entfernen, aber in meinem Fall hatte ich wiederholte Spaltenüberschriften, dh inbound_leads, in jedem Unterarray, so dass ich vor dem nächsten Abschnitt eine Unterbrechung / einen Titel erhielt. Entfernen:
nach dem is_array (), um den Code weiter zu komprimieren und die zusätzliche Spalte zu entfernen.
Da ich sowohl eine Titelzeile als auch eine Datenzeile haben wollte, übergebe ich zwei Variablen an die Funktion und beende beide nach Abschluss des Aufrufs der Funktion mit PHP_EOL:
Ja, ich weiß, dass ich ein zusätzliches Komma hinterlasse, aber der Kürze halber habe ich hier nicht damit umgegangen.
quelle
Arrays von Daten werden umgewandelt in csv ‚text / csv‘ -Format von in PHP - Funktion fputcsv gebaut kümmert sich um Kommas, Zitate und etc ..
Blick auf
https://coderwall.com/p/zvzwwa/array-to-comma-separated -string-in-php
http://www.php.net/manual/en/function.fputcsv.php
quelle
Es hat bei mir funktioniert.
quelle