<?php   ### get_csv_data.php ###
##      Stand 2009-05-16 00:20


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 isset($_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;

}   
       
#------------------------------------------------------------------------------       
function get_record (&$_data, $recno)
{
    $_rec = array();
    
    foreach ($_data as $colname => $field)
    {
        $_rec[$colname] = isset($_data[$colname][$recno])?$_data[$colname][$recno]:NULL;
    }

    return $_rec;
}

#------------------------------------------------------------------------------       
function delete_record (&$_data, $recno)
{
    $cols_deleted = 0; 
    
    foreach ($_data as $colname => $field)
    {
        unset($_data[$colname][$recno]);
        $cols_deleted++;        
    }
    
    return $cols_deleted;
}

#------------------------------------------------------------------------------       
function update_record(&$_data, $recno, $_record, $expand=false)
{
    $cols_updated = 0; 
     
    foreach ($_record as $colname => $data)
    {
        if ($expand or isset($_data[$colname][$recno]))
        {
            $_data[$colname][$recno] = $data;
            $cols_updated++;
        }
    }
    
    return $cols_updated;
}

#------------------------------------------------------------------------------       
function insert_record(&$_data, $recno, $_record, $expand=false, $overwrite=false)
{
    $cols_inserted = 0;

    if (!$overwrite)
    {
        foreach($_record as $colname => $data)
        {
            if (isset($_data[$colname][$recno]))
            {
                return 0;
            }
        }
    }

    foreach ($_record as $colname => $data)
    {
        if ($expand or isset($_data[$colname]))
        {
            $_data[$colname][$recno] = $data;
            $cols_inserted++;
        }
    }

    return $cols_inserted;
}


#==============================================================================
# PHP main
#==============================================================================

$_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');

$_record = array();
$_record['nr']      = 6;
$_record['betreff'] = 'Inserttest';
$_record['anzahl']  = 1;
$_record['beschreibung'] = "Hier ist 'was los!\r\nUnd das nicht zu knapp.";
$_record['extra']   = 'Spalte hinzugefügt?';

$cols_inserted1 = insert_record($_csv, 6, $_record, true);
$cols_inserted2 = insert_record($_csv, 3, $_record, true);

echo "<pre>\r\n";
echo htmlspecialchars(print_r($_csv,1))."\r\n";
echo htmlspecialchars(print_r(get_record($_csv,3),1))."\r\n";
#var_dump($_csv)."\r\n";
echo "<p>Eingefügte Spalten 1.: $cols_inserted1</p>\r\n";
echo "<p>Eingefügte Spalten 2.: $cols_inserted2</p>\r\n";

echo "</pre>\r\n";


?>
