PHP-Array in CSV

Lesezeit: 6 Minuten

PHP Array in CSV
JohnnyFaldo

Ich versuche, eine Reihe von Produkten in eine CSV-Datei zu konvertieren, aber es scheint nicht nach Plan zu gehen. 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 das Gleiche gesucht hat, hat er einen besseren Weg gefunden, es 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");

  • Verwenden Sie $info[]=$ergebnis->fetch_array(); Andernfalls werden die letzten Produktdetails angezeigt

    – GBD

    28. Oktober 2012 um 10:56 Uhr

  • @JohnnyFaldo: Danke Mann! Genau das, was ich brauchte.

    – Cäsar

    27. März 2013 um 19:48 Uhr

  • Hey! Ich weiß, dass dies eine alte Frage ist, aber Sie könnten Ihre eigene Frage beantworten. Es kann Menschen helfen, eine Lösung für ein ähnliches Problem zu finden.

    – Gustavo Straube

    16. März 2018 um 11:53 Uhr

  • Bekommt sonst noch jemand die erste Zeile und die ersten beiden Blöcke der zweiten Zeile leer??

    – mach2

    7. Oktober 2018 um 16:44 Uhr

PHP Array in CSV
Martin Lyne

Anstatt Werte aufzuschreiben, sollten Sie verwenden fputcsv().

Dies kann Ihr Problem sofort lösen.

Hinweis aus Kommentar: Ich sollte erwähnen, dass dies eine Datei auf Ihrem Server erstellt, also müssen Sie den Inhalt dieser Datei lesen, bevor Sie sie ausgeben, auch wenn Sie keine Kopie speichern möchten, müssen Sie die Datei „verlinken“. wenn du fertig bist

  • Ich sollte erwähnen, dass dies eine Datei auf Ihrem Server erstellt, also müssen Sie den Inhalt dieser Datei lesen, bevor Sie sie ausgeben, auch wenn Sie keine Kopie speichern möchten, müssen Sie die Datei dann „verlinken“. du bist fertig.

    – Martin Lyne

    28. Oktober 2012 um 10:50 Uhr

  • Danke für die Bearbeitung Vyktor, mein Tippen ist heute schrecklich! Ich bin normalerweise so vorsichtig.

    – Martin Lyne

    28. Oktober 2012 um 11:08 Uhr

  • könnte ich den Code bearbeiten, den ich oben habe, um dies zu tun? Da es alle Felder ausgibt und Beispiele für fputcsv im Handbuch verwendet, kann ich es nicht dazu bringen

    – JohnnyFaldo

    28. Oktober 2012 um 11:44 Uhr

  • array_to_CSV($daten); function array_to_CSV($data) { $outstream = fopen(“php://output”, ‘r+’); fputcsv($outstream, $data, ‘,’, ‘”‘); zurückspulen($outstream); $csv = fgets($outstream); fclose($outstream); return $csv; }

    – JohnnyFaldo

    28. Oktober 2012 um 11:48 Uhr


  • Ja, das hat es gelöst, danke, habe die Lösung in der ursprünglichen Frage hinzugefügt

    – JohnnyFaldo

    3. November 2012 um 21:30 Uhr

1645909446 847 PHP Array in CSV
trank

Dies ist eine einfache Lösung, die ein Array in eine CSV-Zeichenfolge exportiert:

function array2csv($data, $delimiter=",", $enclosure=""", $escape_char = "\\")
{
    $f = fopen('php://memory', 'r+');
    foreach ($data as $item) {
        fputcsv($f, $item, $delimiter, $enclosure, $escape_char);
    }
    rewind($f);
    return stream_get_contents($f);
}

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);
var_dump(array2csv($list));

Referenz

1645909447 549 PHP Array in CSV
Martin Shutt

Versuchen Sie es mit;

PHP_EOL

Zum Abschluss jeder neuen Zeile in Ihrer CSV-Ausgabe.

Ich gehe davon aus, dass der Text begrenzt, aber nicht in die nächste Zeile verschoben wird?

Das ist eine PHP-Konstante. Es bestimmt das korrekte 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 umbrach.

Wie schreibe ich eine einheitliche neue Zeile in PHP?

In meinem Fall war mein Array mehrdimensional, möglicherweise mit Arrays als Werte. Also habe ich diese rekursive Funktion erstellt, um das Array vollständig auseinanderzublasen:

function array2csv($array, &$title, &$data) {
    foreach($array as $key => $value) {      
        if(is_array($value)) {
            $title .= $key . ",";
            $data .= "" . ",";
            array2csv($value, $title, $data);
        } else {
            $title .= $key . ",";
            $data .= '"' . $value . '",';
        }
    }
}

Da sich die verschiedenen Ebenen meines Arrays nicht gut für das flache CSV-Format eigneten, 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:

agentid     fname           lname      empid    totals  sales   leads   dish    dishnet top200_plus top120  latino  base_packages
G-adriana   ADRIANA EUGENIA PALOMO PAIZ 886                0    19              0         0         0         0      0

Sie könnten diese “intro” (beschreibende) Spalte leicht entfernen, aber in meinem Fall hatte ich in jedem Sub-Array sich wiederholende Spaltenüberschriften, dh inbound_leads, so dass ich einen Bruch/Titel vor dem nächsten Abschnitt hatte. Entfernen:

$title .= $key . ",";
$data .= "" . ",";

nach 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 terminiere beide mit PHP_EOL, wenn der Aufruf der Funktion abgeschlossen ist:

$title .= PHP_EOL;
$data .= PHP_EOL;

Ja, ich weiß, dass ich ein zusätzliches Komma lasse, aber der Kürze halber habe ich es hier nicht behandelt.

1645909447 293 PHP Array in CSV
J nui

Ich weiß, dass das alt ist, ich hatte einen Fall, in dem ich den Array-Schlüssel auch in die CSV aufnehmen musste, also habe ich das Skript von Jesse Q aktualisiert, um das zu tun. Ich habe eine Zeichenfolge als Ausgabe verwendet, da implode keine neue Zeile hinzufügen kann (eine neue Zeile habe ich hinzugefügt und sollte wirklich vorhanden sein).

Bitte beachten Sie, dass dies nur mit Einzelwert-Arrays funktioniert (key, value). könnte aber leicht aktualisiert werden, um mehrdimensional zu handhaben (key, array()).

function arrayToCsv( array &$fields, $delimiter=",", $enclosure=""", $encloseAll = false, $nullToMysqlNull = false ) {
    $delimiter_esc = preg_quote($delimiter, "https://stackoverflow.com/");
    $enclosure_esc = preg_quote($enclosure, "https://stackoverflow.com/");

    $output="";
    foreach ( $fields as $key => $field ) {
        if ($field === null && $nullToMysqlNull) {
            $output="";
            continue;
        }

        // Enclose fields containing $delimiter, $enclosure or whitespace
        if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
            $output .= $key;
            $output .= $delimiter;
            $output .= $enclosure . str_replace($enclosure, $enclosure . $enclosure,     $field) . $enclosure;
            $output .= PHP_EOL;
        }
        else {
            $output .= $key;
            $output .= $delimiter;
            $output .= $field;
            $output .= PHP_EOL;
        }
    }

    return  $output ;
}

1645909447 419 PHP Array in CSV
geisterfurz007

Datenarrays werden durch die eingebaute PHP-Funktion fputcsv in das csv-‘text/csv’-Format konvertiert, das sich um Kommas, Anführungszeichen usw. kümmert.
Ansehen
https://coderwall.com/p/zvzwwa/array-to-comma-separated-string-in-php
http://www.php.net/manual/en/function.fputcsv.php

1645909448 697 PHP Array in CSV
Amir Khan

Es hat für mich funktioniert.

 $f=fopen('php://memory','w');
 $header=array("asdf ","asdf","asd","Calasdflee","Start Time","End Time" );      
 fputcsv($f,$header);
 fputcsv($f,$header);
 fputcsv($f,$header); 
 fseek($f,0);
 header('content-type:text/csv'); 
 header('Content-Disposition: attachment; filename="' . $filename . '";');
 fpassthru($f);```

868180cookie-checkPHP-Array in CSV

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy