Mike: array_flip() fehlerhaft?

Hi,

mir fiel gerade eine Besonderheit bei array_flip() auf. Normalerweise dürfte doch ein  Tausch mit leeren Werten nicht funktionieren:

"
Beachten Sie, dass die Werte von trans gültige Schlüssel sein müssen, z.B. haben sie entweder integer oder string zu sein. Ist ein Wert vom falschen Typ wird eine Warnung ausgegeben, und das Schlüssel/Werte-Paar wird nicht vertauscht.
"

Wenn ich aber nun ein Array habe:
*Alles var_export() Ausgaben

array (
  0 => '',
  1 => '',
  2 => '',
  3 => '',
)

macht array_flip() daraus:

array (
  '' => 3,
)

das dürfte doch nicht sein, oder?

Mike

  1. Hallo,

    mir fiel gerade eine Besonderheit bei array_flip() auf. Normalerweise dürfte doch ein  Tausch mit leeren Werten nicht funktionieren:

    das hängt davon ab, was Du als "leeren Wert" ansiehst.

    Beachten Sie, dass die Werte von trans gültige Schlüssel sein müssen, z.B. haben sie entweder integer oder string zu sein. Ist ein Wert vom falschen Typ wird eine Warnung ausgegeben, und das Schlüssel/Werte-Paar wird nicht vertauscht.
    "

    Wenn ich aber nun ein Array habe:
    *Alles var_export() Ausgaben

    array (
      0 => '',
      1 => '',
      2 => '',
      3 => '',
    )

    macht array_flip() daraus:

    erwartungsgemäß

    array (
      '' => 3,
    )

    das dürfte doch nicht sein, oder?

    doch sicher. Das ist ganz genauso dokumentiert. Ein Leerstring ist ein String. Ein Leerstring als Array-Key ist zulässig, siehe Handbuch, Arrays (unterhalb der Warnung).

    Freundliche Grüße

    Vinzenz

    1. Hi,

      »» das dürfte doch nicht sein, oder?

      doch sicher. Das ist ganz genauso dokumentiert. Ein Leerstring ist ein String. Ein Leerstring als Array-Key ist zulässig, siehe Handbuch, Arrays (unterhalb der Warnung).

      hmmm, das hatte ich bisher immer so verstanden, dass man bei der Dekalration wie üblich so vorgehen kann:

      $ar[] = 'a';
      $ar[] = 'b';

      Dann wird ja automatisch ein numerisches Array daraus.

      Aber das tatsächlich der Key leer, im Sinne von nicht sichtbar, sein darf, hätte ich nicht gedacht und irritiert mich auch ein wenig.

      Aber wenn es nun mal so ist...

      Danke
      Mike

      1. Hi Mike!

        $ar[] = 'a';
        $ar[] = 'b';
        Dann wird ja automatisch ein numerisches Array daraus.

        Was hat das mit deiner Ausgangsfrage zu tun?

        Aber das tatsächlich der Key leer, im Sinne von nicht sichtbar, sein darf, hätte ich nicht gedacht und irritiert mich auch ein wenig.

        Der Key ist ja nicht leer. In PHP ist ein Leerstring nunmal ein definierter, also erlaubter Wert für einen Arrayschlüssel.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      2. Hallo,

        » doch sicher. Das ist ganz genauso dokumentiert. Ein Leerstring ist ein String. Ein Leerstring als Array-Key ist zulässig, siehe Handbuch, Arrays (unterhalb der Warnung).
        »

        hmmm, das hatte ich bisher immer so verstanden, dass man bei der Dekalration wie üblich so vorgehen kann:

        $ar[] = 'a';
        $ar[] = 'b';

        Dann wird ja automatisch ein numerisches Array daraus.

        ja und es ist etwas anderes als das Verwenden des Leerstrings als Key. Ich zitiere das, was ich Dir verlinkt habe und auf was ich Dich extra hingewiesen habe:

        <zitat>
            Using the empty string as a key will create (or overwrite) a key with the
            empty string and its value; it is not the same as using empty brackets.
        </zitat>

        Aber das tatsächlich der Key leer, im Sinne von nicht sichtbar, sein darf, hätte ich nicht gedacht und irritiert mich auch ein wenig.

        Die folgenden Anweisungen führen dazu, dass jeweils das gleiche Arrayelement verändert (bzw. gesetzt) wird:

        ~~~php $ar['']   = 'a';
            $ar['']   = 'b';
            $ar[NULL] = 'c';

          
        ganz genauso wie es in der verlinkten Doku steht. Wenn der Key der Leerstring ist, weist der Key einen definierten Wert vom Typ String auf. Wenn Du "leer" im Sinne von empty() interpretierst, dann gibt es Werte, für die empty() TRUE liefert, die aber als Key zugelassen sind. Dazu zählt auch der Integer-Wert 0.  
          
        Daher müsstest Du definieren, was Du unter "leer" verstehst. Genau aus diesem Grund habe ich Dich in [meinem ersten Beitrag](https://forum.selfhtml.org/?t=186020&m=1235147) zu Beginn darauf hingewiesen.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. Hi,

          ich hatte das alles schon soweit verstanden. Die Frage war somit auch beantwortet. Dennoch finde ich es nach wie vor irritierend. Für mich ist ein Arrayschlüssel soetwas wie Primary-Key(klar ist dem nicht wirklich so) bei einer DB, daher war es am Anfang schon schwer nachvollziehbar warum die immer mit 0 anfangen. Das aber auch $ar[''] geht ist für mich nicht nach vollziehbar, warum das gut sein soll.

          Aber wie gesagt, verstanden ja, Frage beantwortet ja, Logik warum das so sein darf, nein.

          Mike