<?php   ### get_csv_data.php ###
##      Stand 2009-05-15 19:19


error_reporting(E_ALL);


#------------------------------------------------------------------------------

define('MAX_LINE_LENGTH', 8192);
define('DELIMITER', ';');
define('ENCLOSURE', '"');
define('MISSING_COL','###');  ## Ersatzwert für fehlenden Spaltenwert


#------------------------------------------------------------------------------

function get_csv_data($filename, $_colnames = false)
{
   $fh = fopen($filename,'r');
   
   if (!$fh) return false;    ## oder Fehlernummer

   if (!flock($fh, LOCK_SH))
   {
       fclose($fh);
       return false;          ## oder Fehlernummer
   }     

   $_data = array();          ## leeren Rückgabewert bereitstellen

   if ($_colnames !== false)  ## wenn keine spaltenweise Darstellung stattfinden soll
   {
       if (is_string($_colnames))  ## Wenn die Spaltennamen als Komma-separierter String übergeben wurden
       {
           $_colnames = trim($_colnames,'()');   ## Wenn die Spaltennamen z.B. aus einem enum-Feld stammen
           $_colnames = explode(',',$_colnames);
       } 

       if (!is_array($_colnames))  ## Wenn das Zerlegen nicht geklappt hat oder kein Array übergeben wurde
       {
           $_colnames = fgetcsv($fh, MAX_LINE_LENGTH, DELIMITER, ENCLOSURE);  ## erste Zeile enthält Spaltennamen
       }

       if (!$_colnames)            ## Holen der ersten Zeile ist schon schief gegangen -> Ende im Gelände
       {
           fclose($fh);
           return false;      ## oder Fehlernummer
       }
    }       

    if ($_colnames === false)      ## es soll ein zeilenweise organisiertes Array zurückgegeben werden
    {
        while(false!==($_rec = fgetcsv($fh, MAX_LINE_LENGTH, DELIMITER, ENCLOSURE)))
        {
            $_data[] = $_rec;
        }    
    }
    else                           ## es wird ein spaltenweise organisiertes Array zurückgegeben
    {
        $recno = 0; 

        while(false!==($_rec = fgetcsv($fh, MAX_LINE_LENGTH, DELIMITER, ENCLOSURE)))
        {
            $recno++;

            foreach($_colnames as $key => $col)   ## nur benannte Spalten werden übernommen.
            {
                ##-- Due to the buggy php function. It doesn't work like discribed!
                ##-- empty rows aren't reported as an one element array pointing to NULL
                $_data[$col][$recno] = (isset($_rec[$key]) and !is_null($_rec[1]))?$_rec[$key]:MISSING_COL;    
#                $_data[$col][$recno] = (isset($_rec[$key]) and !is_null($_rec[$key]))?$_rec[$key]:MISSING_COL;    
            }
        }
    }  
    
    fclose($fh);

    return $_data;

}   
       
#------------------------------------------------------------------------------       

$_columns = array('NO','SUBJ','QTTY','MEMO','EXTRA');

#$_csv = get_csv_data('csv02.txt', '(nummer,subject,anzahl,memo)');
#$_csv = get_csv_data('csv02.txt', $_columns);
#$_csv = get_csv_data('csv02.txt', true);
$_csv = get_csv_data('csv02.txt');

echo "<pre>\r\n";
echo htmlspecialchars(print_r($_csv,1));
#var_dump($_csv);
echo "</pre>\r\n";


?>