Gerrit: Verständnisfrage zu explode

Hallo,

ich bin in PHP noch ein relativer Neuling und habe nur eine syntaktische Frage zu explode.

In Javascript funktioniert sowas:
var test = beispiel_text.split(' ')[0];

...also der direkte Zugriff auf den ersten String im Array.

In PHP gibt mir aber:
$test = explode(' ', $beispiel_text)[0];

immer 'ne Fehlermeldung aus, weil [ nicht erlaubt ist.
Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann? Also bspw.

$feld = explode(' ', $beispiel_text);
$test = $feld[0];

...weil, das geht, ist aber nicht so schön :-).

Vielen Dank für Eure Hilfe.
Gerrit

  1. Hi,

    ich bin in PHP noch ein relativer Neuling und habe nur eine syntaktische Frage zu explode.

    nicht nur zu explode(), sondern zur Auswertung komplexerer Ausdrücke allgemein.

    In Javascript funktioniert sowas:
    var test = beispiel_text.split(' ')[0];
    ...also der direkte Zugriff auf den ersten String im Array.

    Ja. Javascript kann Funktionsaufrufe, Zugriff auf Objekteigenschaften und Arrayelemente beliebig in einem Ausdruck verknüpfen.

    In PHP gibt mir aber:
    $test = explode(' ', $beispiel_text)[0];
    immer 'ne Fehlermeldung aus, weil [ nicht erlaubt ist.

    Richtig, explode() gibt ein Array zurück, das PHP nicht einfach so "freihändig in der Luft" weiter bearbeiten kann.

    Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann?

    Ja, leider. Eine Schwäche in der Implementierung. Nicht schön, aber bekannt (im Sinne von "dokumentiert").

    So long,
     Martin

    --
    Zwei Politiker auf dem Weg zum Sitzungssaal: "Was sagten Sie in ihrer Rede neulich noch zur Rentenreform?" - "Nichts." - "Ja, schon klar. Aber wie haben Sie es formuliert?"
    1. Hallo Martin,

      Deine Antwort ist wie immer schnell und fundiert!
      Vielen Dank!

      Beste Grüße
      Gerrit

    2. Hi!

      Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann?
      Ja, leider. Eine Schwäche in der Implementierung.

      Wieso sollte das ein Schwäche darstellen? Das ist doch so gewollt!

      Nicht schön, aber bekannt (im Sinne von "dokumentiert").

      Wie würdest Du das implementieren?

      Btw: man kann auch list() nutzen, um Im Arraykontext einzelnen Variablen Werte zuzuweisen - wenn ich den Aufbau eines zu splittenden Strings kenne und 'sprechende' Variablen bevorzuge, nutze ich gerne so etwas:

        
      $info = 'Stielzchen:Rumpel:Tee';  
      list ($name, $firstname, $drink) = explode(':', $info);  
      
      

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      1. Hallo,

        Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann?
        Ja, leider. Eine Schwäche in der Implementierung.
        Wieso sollte das ein Schwäche darstellen? Das ist doch so gewollt!

        wenn es so gewollt ist, wäre es eine künstliche Einschränkung der Syntax von Ausdrücken. Ich denke eher, es hat sich bei der Implementierung einfach so ergeben, ist nicht sofort aufgefallen, und später hat man dann gesagt, "komm, is' nich schlimm, bleibt so".

        Nicht schön, aber bekannt (im Sinne von "dokumentiert").
        Wie würdest Du das implementieren?

        Ich würde einen Parser so entwerfen, dass er beliebige Ausdrücke in beliebiger Verkettung und/oder Verschachtelung bearbeiten kann, wobei "beliebig" seine Grenzen im zur Verfügung stehenden Speicher hat (Stack). Ein Array oder Objekt als Zwischenergebnis muss dann halt auch mal temporär auf dem Stack zwischengelagert werden. Wie gesagt: Solange genug Speicher zur Verfügung steht.

        Btw: man kann auch list() nutzen, um Im Arraykontext einzelnen Variablen Werte zuzuweisen

        Man kann damit sogar gezielt auf *einzelne* Arrayelemente zugreifen, indem man die nicht benötigten Plätze in der Variablenliste leer lässt. Allerdings versagt list() bei Arrays mit alphanumerischen Keys.

        So long,
         Martin

        --
        Zwei Kumpels sitzen vor dem Computer. "Welche Suchmaschine beutzt du eigentlich meistens?" - "Prima Vera." - "Hmm, kenn' ich gar nicht." Dann geht die Tür auf: "Schatz ich habe deine Sonnenbrille wiedergefunden!" - "Prima, Vera!"
        1. Hi!

          Ich würde einen Parser so entwerfen, dass er beliebige Ausdrücke in beliebiger Verkettung und/oder Verschachtelung bearbeiten kann, wobei "beliebig" seine Grenzen im zur Verfügung stehenden Speicher hat (Stack). Ein Array oder Objekt als Zwischenergebnis muss dann halt auch mal temporär auf dem Stack zwischengelagert werden. Wie gesagt: Solange genug Speicher zur Verfügung steht.

          Wie sollte das dann in PHP-Syntax aussehen? Dedlfix' Antwort finde ich ja ganz nett, aber wie sollte man (ohne Objektnotation) auf ein einzelnes Element zugreifen wollen? So: explode($foo)[$bar]?

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          1. Hallo,

            Ich würde einen Parser so entwerfen, dass er beliebige Ausdrücke in beliebiger Verkettung und/oder Verschachtelung bearbeiten kann, ...
            Wie sollte das dann in PHP-Syntax aussehen?
            So: explode($foo)[$bar]?

            genau so - wie sonst? Es ergibt sich doch ganz automatisch aus der Logik:

            explode(...)   liefert ein Array
             [...]          indiziert ein Element im Array

            In Javascript geht's ja genauso.

            Ciao,
             Martin

            --
            Niemand lebt allein von seinen Träumen.
            Aber wer träumt, lebt noch.
            1. Hi!

              Ich würde einen Parser so entwerfen, dass er beliebige Ausdrücke in beliebiger Verkettung und/oder Verschachtelung bearbeiten kann, ...
              Wie sollte das dann in PHP-Syntax aussehen?
              So: explode($foo)[$bar]?

              genau so - wie sonst?

              Nun: das ist aber so in PHP nicht vorgesehen - bei Funktionen und Methoden, welche Objekte zurück geben funktioniert ja die von dedlfx beschriebene Methode.

              Es ergibt sich doch ganz automatisch aus der Logik:

              Das bezweifle ich ja nicht, aber PHP ist nun einmal anders designt worden. Du kannst natürlich einwenden, dass ich mich in den Jahren an die 'Eigenarten' von PHP gewöhnt habe und diese deshalb als 'normal' empfinde und hättest damit auch recht;-)

              In Javascript geht's ja genauso.

              Auch in Java, C# etc.. - aber diese Sprachen sind nicht PHP.

              off:PP

              --
              "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
              1. Ich würde einen Parser so entwerfen, dass er beliebige Ausdrücke in beliebiger Verkettung und/oder Verschachtelung bearbeiten kann, ...
                Wie sollte das dann in PHP-Syntax aussehen?
                So: explode($foo)[$bar]?
                genau so - wie sonst?
                Nun: das ist aber so in PHP nicht vorgesehen

                Nun man könnte das Problem über eine Funktion lösen. Ich komme drauf, weil ich in letzter Zeit wieder viel mit TCL arbeite und da funktioniert das so :)
                Sähe dann etwa so aus:
                $first_element = get_element_from_array(explode($text, ' '), 0);
                So und entweder es gibt eine Funktion wie get_element_from_array und sie ist mir nur nicht bekannt oder man schreibt sie mal schnell, wie lang wird die? vier Zeilen? Gut acht Zeilen, dann kann sie aber auch auf einen nummerischen Index von assoziativen arrays zugreifen ^^ mit optionalem sort() :-D

                --
                sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
                1. Hi!

                  $first_element = get_element_from_array(explode($text, ' '), 0);
                  So und entweder es gibt eine Funktion wie get_element_from_array und sie ist mir nur nicht bekannt oder man schreibt sie mal schnell, wie lang wird die? vier Zeilen?

                  Eine, inklusive Defaultwert-Über- und Rückgabe (oder 4 mit Vor- und Abspann und einer Zeile Abstand zur nächsten Funktion aber ohne Dokumentation).

                  function get_element_from_array($array, $key, $default) {
                    return isset($array[$key]) ? $array[$key] : $default;
                  }

                  Gut acht Zeilen, dann kann sie aber auch auf einen nummerischen Index von assoziativen arrays zugreifen ^^ mit optionalem sort() :-D

                  Beim Zugriff auf ein einzelnes Element einer sortierten Menge kann ich mir grad nur vorstellen, dass es das erste oder letzte ist. Und dafür gibt es reset() und end().

                  Lo!

      2. Hi!

        Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann?
        Ja, leider. Eine Schwäche in der Implementierung.
        Wieso sollte das ein Schwäche darstellen? Das ist doch so gewollt!

        Wie auch immer. Man könnte es als Schwäche PHPs auslegen, dass man gegenüber anderen Programmiersprachen eine zusätzliche Variable anlegen muss, um auf ein bestimmtes Array-Element des Rückgabewertes zuzugreifen. Man könnte es auch als konzeptionellen Fehler des Programmierers auslegen, weil er sich ein Array erzeugen lässt, aber nur einen einzigen Wert benötigt. Warum dann nicht gleich was passendes formulieren, um nur diesen einen Wert zu bekommen?

        Nicht schön, aber bekannt (im Sinne von "dokumentiert").
        Wie würdest Du das implementieren?

        So wie bei Objekten auch. Wenn ein solches über eine Funktion zurückgegeben wird, kann man auch gleich mit -> auf Methoden und Eigenschaften davon zugreifen:

        foo()->bar

        Lo!

        1. Hi!

          Nicht schön, aber bekannt (im Sinne von "dokumentiert").
          Wie würdest Du das implementieren?

          So wie bei Objekten auch. Wenn ein solches über eine Funktion zurückgegeben wird, kann man auch gleich mit -> auf Methoden und Eigenschaften davon zugreifen:

          foo()->bar

          Das dürfte der Tatsache geschuldet sein, dass PHP ursprünglich nicht als
          OOP-Sprache konzipiert wurde und bis heute keine 'reine' OOP-Sprache ist.
          Ich gebe Dir natürlich recht, dass Dein Beispiel oben etwas eleganter aussieht, weil man ein bißchen weniger Code benötigt und sich eine Variable spart.

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  2. Moin!

    ich bin in PHP noch ein relativer Neuling und habe nur eine syntaktische Frage zu explode.

    In Javascript funktioniert sowas:
    var test = beispiel_text.split(' ')[0];

    ...also der direkte Zugriff auf den ersten String im Array.

    In PHP gibt mir aber:
    $test = explode(' ', $beispiel_text)[0];

    immer 'ne Fehlermeldung aus, weil [ nicht erlaubt ist.
    Muss ich wirklich immer erst ein Array definieren, bevor ich auf die einzelnen Werte zugreifen kann? Also bspw.

    $feld = explode(' ', $beispiel_text);
    $test = $feld[0];

    ...weil, das geht, ist aber nicht so schön :-).

    Was willst du wirklich? Brauchst du das Array von explode? Nein. Was du tun willst, ist auf den ersten Teil des Strings zuzugreifen, bis zum ersten Vorkommen des Leerzeichens.

    Dafür Array-Operationen zu verwenden ist nicht wirklich schön. PHP hat viele schöne Stringfunktionen, die dir genau das liefern können, was du hier nur suchst: Den ersten Teil eines Strings bis zum ersten Leerzeichen.

    - Sven Rautenberg

    1. Dafür Array-Operationen zu verwenden ist nicht wirklich schön.

      Sagte dedlfix auch bereits ;)