Enrico: An "list()" Array übergeben statt statischer Bezeichner

Mahlzeit,

ich splitte eingelesene Textdateien mittels des explode-Befehls in einzelne Zeilen auf:

$Zeilen = explode ("[ZEILENVORSCHUB]", $Inhalt);

Hierbei verwende ich den String "[ZEILENVORSCHUB"] als Ersatz für die verschiedenen Zeilenvorschubcodes, die Variable "$Inhalt" enthält zu diesem Zeitpunkt den Inhalt der jeweiligen Textdatei.

Danach splitte ich die einzelnen Zeilen in die benötigten Spalten auf, die ich aktuell statisch vorgebe:

list ($Ebene, $Name, $eMail, $Homepage, $Nachricht, $Datum, $Uhrzeit, $IP, $Token, $Status) = explode ("|#|", $Zeilen [$i]);

Da ich aber mit verschiedenen Textdateien mit unterschiedlicher Anzahl und Bezeichnung der Spalten arbeite, möchte ich der Anweisung "list ()" die jeweils benötigten Spalten als Array übergeben.

Dies bedeutet, dass aus ...

list ($Ebene, $Name, $eMail, $Homepage, $Nachricht, $Datum, $Uhrzeit, $IP, $Token, $Status) = explode ("|#|", $Zeilen [$i]);

... letztendlicher folgender Code werden soll:

$Spalten = array ("$Ebene", "$Name, "$eMail", "$Homepage", "$Nachricht", "$Datum", "$Uhrzeit", "$IP", "$Token", "$Status");

list ($Spalten) = explode ("|#|", $Zeilen [$i]);

Aber so kann es nicht funktionieren, da "list" ja die Bezeichner als Variablen und nicht als Array sieht, oder?

Wie muss ich hier vorgehen, damit mein Vorhaben wie beabsichtigt klappt?

Vielen Dank für eure Mithilfe.

Gruß
Enrico

  1. Hi,

    Wie muss ich hier vorgehen, damit mein Vorhaben wie beabsichtigt klappt?

    Du könntest erst mal die Nutzerkommentare zu list durchschauen, die bieten schon Ansätze.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo ChrisB,

      dann muss ich die Seite nochmals durchforsten, beim ersten Einarbeiten konnte ich hier leider keine Ansätze finden, deswegen hatte ich mich auch an euch gewandt.

      Gruß
      Enrico

      1. Hallo ChrisB,

        dann muss ich die Seite nochmals durchforsten, beim ersten Einarbeiten konnte ich hier leider keine Ansätze finden, deswegen hatte ich mich auch an euch gewandt.

        Wieso? Da steht doch im Wesentlichen, dass Du an list() auch Array-Elemente als Argumente übergeben kannst. Mein Beispiel:

        <?php  
        $ar=array();  
        list ($ar['Feld1'], $ar['Feld2'])=array('foo', 'bar');  
        var_dump($ar);  
        ?>
        

        Die Reihenfolge der Ausgabe mit var_dump ist merkwürdig, bei einem foreach ist das von Interesse, bei einem hash aber eher nicht.

        array(2) {
          ["Feld2"]=>
          string(3) "bar"
          ["Feld1"]=>
          string(3) "foo"
        }

        1. [latex]Mae  govannen![/latex]

          <?php

          $ar=array();
          list ($ar['Feld1'], $ar['Feld2'])=array('foo', 'bar');
          var_dump($ar);
          ?>

          
          >   
          > Die Reihenfolge der Ausgabe mit var\_dump ist merkwürdig, bei einem foreach ist das von Interesse, bei einem hash aber eher nicht.  
          >   
          > array(2) {  
          >   ["Feld2"]=>  
          >   string(3) "bar"  
          >   ["Feld1"]=>  
          >   string(3) "foo"  
          > }  
            
          Inwiefern ist das merkwürdig? Darauf wird auf der Seite ziemlich unübersehbar hingewiesen  
            
          Stur lächeln und winken, Männer!  
          Kai
          
          -- 
          Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken  
          in Richtung "Mess up the Web".([suit](https://forum.selfhtml.org/?t=197497&m=1324775))  
          [SelfHTML-Forum-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet)
          
        2. Hi!

          Wieso? Da steht doch im Wesentlichen, dass Du an list() auch Array-Elemente als Argumente übergeben kannst. Mein Beispiel:
          list ($ar['Feld1'], $ar['Feld2'])=array('foo', 'bar');

          Da kommt er aber vom Regen in die Traufe. Er will list() ja aben keine einzelnen Elemente sondern nur _ein_ Array mit allen Variablennamen darin übergeben.

          Lo!

          1. Da kommt er aber vom Regen in die Traufe. Er will list() ja aben keine einzelnen Elemente sondern nur _ein_ Array mit allen Variablennamen darin übergeben.

            Da fällt mir auf die Schnelle nur das böse eval ein.

            <?php  
            $ar=array();  
            $strFeldList=array();  
            $arFelder=array('Feld_Foo', 'Feld_Bar');  
              
            foreach ($arFelder as $strFeld) {  
               $arFeldList[]='$ar[\'' . $strFeld . '\']';  
            }  
              
            $strExecute='list('.implode(',', $arFeldList).')=$arData;';  
            #Um beim Entwickeln ggfs. zu sehen, was Du machst:  
            print($strExecute)."<br />/n/n";  
              
            $arData=array('foo', 'bar');  
            eval($strExecute);  
              
            var_dump($ar);  
            ?>  
            
            

            Das Beispiel funktioniert jedenfalls.

            1. Da kommt er aber vom Regen in die Traufe. Er will list() ja aben keine einzelnen Elemente sondern nur _ein_ Array mit allen Variablennamen darin übergeben.

              Falls es denn echte Variablennamen sein sollen:

              <?php  
              $ar=array();  
              $arVars=array('$Foo', '$Bar');  
              $strExecute='list('.implode(',', $arVars).')=$arData;';  
              #Um beim Entwickeln ggfs. zu sehen, was Du machst:  
              print($strExecute) . "\n<br />\n";  
              $arData=array('foo', 'bar');  
              eval($strExecute);  
              print '$Foo=' . $Foo . "\n<br />\n" . '$Bar='. $Bar . "\n<br />\n";  
              ?>
              

              Aber darauf wäre er nun selbst gekommen. Nicht wahr?

              Fred

            2. Hi!

              Da kommt er aber vom Regen in die Traufe. Er will list() ja aben keine einzelnen Elemente sondern nur _ein_ Array mit allen Variablennamen darin übergeben.
              Da fällt mir auf die Schnelle nur das böse eval ein.

              Ich nehme mal an, dass die Variablennamen unter der Kontrolle des Programms stehen und keine externen Elemente den Weg ins eval() finden. In dem Fall ist es nicht mehr böse. Viel zu aufwendig bliebt es aber, denn man kann dann auch gleich die foreach-Schleife so umschreiben, dass die Variablen direkt angelegt werden. Und wie schon erwähnt gibt es noch zwei mögliche Lösungen.

              Lo!

        3. Hallo Fred,

          $ar=array();
          list ($ar['Feld1'], $ar['Feld2'])=array('foo', 'bar');
          var_dump($ar);

          Hier liegt ja, sofern ich nicht komplett auf'm Schlauche stehe, respektive sitze, mein Problem.

          Hier habe ich auch wieder statisch einzugebende Bezeichner mit einer festgelegten Zahl, aber ich habe ja unterschiedlich viele Bezeichner mit unterschiedlichen Namen.

          Einmal habe ich...
          list ($Ebene, $Name, $eMail, $Homepage, $Nachricht, $Datum, $Uhrzeit, $IP, $Token, $Status) = explode ("|#|", $Zeilen [$i]);

          Ein anderes Mal hingegen...
          list ($Name, $Nachricht, $Datum, $Uhrzeit) = explode ("|#|", $Zeilen [$i]);

          Und hier habe ich...
          list ($Datum, $Uhrzeit, $IP) = explode ("|#|", $Zeilen [$i]);

          Nur um ein paar Varianten zu nennen.

          Um Dein Beispiel aufzugreifen:

          $ar wird mit den jeweiligen Spalten als später zu verwendende Bezeichner vorbelegt und an "list ()" übergeben.

          Ich brauche das Array aber bereits im "list()"-Befehl, da ich auf gleicher "Ebene" den "explode"-Befehl ausführe.

          Gruß
          Enrico

  2. Hi!

    $Spalten = array ("$Ebene", "$Name, "$eMail", "$Homepage", "$Nachricht", "$Datum", "$Uhrzeit", "$IP", "$Token", "$Status");
         list ($Spalten) = explode ("|#|", $Zeilen [$i]);
    Aber so kann es nicht funktionieren, da "list" ja die Bezeichner als Variablen und nicht als Array sieht, oder?

    list() ist ein Sprachkonstrukt. Die Parameter sieht es noch nicht mal als Variablen sondern als deren Namen.

    Alles was man mit normalen Funktionen anfangen kann, lässt sich mit list() nicht anstellen. Und so gehen auch call_user_func()-Aufrufe damit nicht.

    Wie muss ich hier vorgehen, damit mein Vorhaben wie beabsichtigt klappt?

    Nimm was anderes als list(). eval() geht, aber bevor du anfängst, den eval-Code zusammenzubauen kannst du gleich über eine Schleife die Variablen direkt anlegen.

    Wenn dir auch ein assoziatives Array statt einzelner Variablen zusagt, gäbe es noch array_combine()? Und zur Not kann man das auch noch extrahieren.

    Lo!