Tom: PHP Problem - fgetcsv

Beitrag lesen

Hello,

Ich testete eben mal und kann bestätigen, dass sich das Verhalten von fgetcsv() zwischen PHP 4.4.8 und 5.2.6 geändert hat.

In PHP4(.3.0|.4.8) werden leere Element als ein String mit 0 Zeichen Länge zurückgeliefert, in PHP5 fehlt das Element einfach.

Ich habe das eben in ellenlanger Sitzung (das verflixte Semikolon hinter der while-Schleife *duck*) auch nochmal ausprobiert.

Hier das Ergebnis:

Das Script:

<?php    ### fgetcsv01.php ###

Im welche Typen werden unterschiedliche Elemente umgesetzt?

#------------------------------------------------
function show(&$_data)
{
        echo "<pre\r\n>";
#        echo htmlspecialchars(print_r(func_get_args(),1));
        var_dump($_data);
        echo "</pre\r\n>";
}
#------------------------------------------------
$filename = "csv01.txt";

define('MAX_LINE_LENGTH', 4096);
define('FIELD_SEPARATOR', ';');
define('FIELD_ENCLOSURE', '"');

echo "<h2>PHP-Version: ".phpversion()."</h2>\r\n";

ini_set('auto_detect_line_endings','true');

$fh = fopen($filename,  'rb');

$_rec = array();
$_list = array();

if ($fh)
{
    echo "<pre\r\n>";
    while (!feof($fh))
    {
        $buffer = fgets($fh, MAX_LINE_LENGTH);
        echo htmlspecialchars($buffer);
    }
    echo "</pre\r\n>";

rewind($fh);

while (( $_rec = fgetcsv($fh, MAX_LINE_LENGTH, FIELD_SEPARATOR, FIELD_ENCLOSURE)) !== false )
#    while (( $_rec = fgetcsv($fh)) !== false )
    {
        show($_rec);
        $_list[] = $_rec;
    }

fclose($fh);
    show($_list);
}
?>

PHP-Version: 5.2.5 im XAMPP

1;"Erste Zeile";0;"Text"
2;"Zeite Zeile";0.11;"mehr Text"
3;"Dritte Zeile";;"kein Eintrag vorhanden"

5;"nach der Leerzeile";22;"letzter Eintrag"

array(4) {
  [0]=>
  string(1) "1"
  [1]=>
  string(11) "Erste Zeile"
  [2]=>
  string(1) "0"
  [3]=>
  string(4) "Text"
}

array(4) {
  [0]=>
  string(1) "2"
  [1]=>
  string(11) "Zeite Zeile"
  [2]=>
  string(4) "0.11"
  [3]=>
  string(9) "mehr Text"
}

array(4) {
  [0]=>
  string(1) "3"
  [1]=>
  string(12) "Dritte Zeile"
  [2]=>
  string(0) ""
  [3]=>
  string(22) "kein Eintrag vorhanden"
}

array(1) {
  [0]=>
  string(0) ""
}

array(4) {
  [0]=>
  string(1) "5"
  [1]=>
  string(18) "nach der Leerzeile"
  [2]=>
  string(2) "22"
  [3]=>
  string(15) "letzter Eintrag"
}

Könnte es sein, dass in der nächsten PHP-Version versucht wurde, die Typenumsetzung einzubauen?
Wenn Enclosures angegeben werden, werden nicht eingeschlossene Felder als Numeric, eingeschlossene  Felder als String und nicht eingeschlossene leere Felder als NULL dargestellt. Das hat es meiner Erinnerung nach schon mal bei einer älteren PHP-Version gegeben.

Leider kollidierte das mit dem Array-Verhalten. Ein Array-Element, dem man NULL zuwies, verschwand einfach aus der Liste.

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de