Thomas Schmieder: Index eines Elementes im numerischen Array ermitteln

Mahlzeit,

ich habe ein numerisches Array:

$feld=array("Hund","Katze","HUhn","Kater");

Ich lösche ein Element mit unset($feld[2]);

Ich gebe das Array mit

foreach($feld as $wert)
{
  echo $wert."<br />";
}

aus. Während der Ausgabe würde ich gerne den numerischen Index ermitteln, mit dem ich auch auf die Elemente des Arrays zugreifen kann. Gibt es dafür eine Möglichkeit?

Dass die Bearbeitung mit array_splice() und array_slice() besser ist, weiß ich. Hier geht es mur um die _Möglichkeit_, den Index zu erfragen.

Grüße

Tom

  1. Hallo Thomas,

    Ich gebe das Array mit

    foreach($feld as $wert)
    {
      echo $wert."<br />";
    }

    aus. Während der Ausgabe würde ich gerne den numerischen
    Index ermitteln, mit dem ich auch auf die Elemente des
    Arrays zugreifen kann. Gibt es dafür eine Möglichkeit?

    Nein. Geh die Schleife in einer for-i-Schleife durch.

    Dass die Bearbeitung mit array_splice() und array_slice()
    besser ist, weiß ich. Hier geht es mur um die
    _Möglichkeit_, den Index zu erfragen.

    Da muesstest du suchen. Ist der Array sortiert, geht das
    relativ zuegig. Ist der Array unsortiert, kann das uU sehr
    langsam sein. Zu Such- und Sortier-Algorithmen kann ich
    'Algorithmen in C' empfehlen.

    Gruesse,
     CK

    1. Hallo Christian,

      Nein. Geh die Schleife in einer for-i-Schleife durch.

      Da muesstest du suchen. Ist der Array sortiert, geht das
      relativ zuegig. Ist der Array unsortiert, kann das uU sehr
      langsam sein. Zu Such- und Sortier-Algorithmen kann ich
      'Algorithmen in C' empfehlen.

      Das habe ich befürchtet. Werde ich also die neuen Sachen NICHT mehr mit Direkzuweisungen und Unset schreiben. sondern grundsätzlich array_slice und array_splice verwenden. Die alten Scripte werde ich dann wohl nicht mehr ergänzen. Das ist mir zu stressig, das überall zu überprüfen.

      Danke Dir

      Tom

  2. Mahlzeit,

    liebend gern... *g*

    foreach($feld as $wert)
    {
      echo $i;
      echo $wert."<br />";
      $i++;
    }

    da er ja von anfang an durchzählt enthält $i immer den index,aber
    ich vermute das meinst Du nicht, aber wie meinst du es dann, in welcher Form brauchst du den index während der ausgabe???

    LG
    romy

    Grüße

    Tom

    --
    DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
    1. Hoi romy,

      foreach($feld as $wert)
      {
        echo $i;
        echo $wert."<br />";
        $i++;
      }

      da er ja von anfang an durchzählt enthält $i immer den
      index,

      Nein. Die Reihenfolge, in der man die Elemente in einem
      foreach()-Durchlauf bekommt, ist nicht definiert.

      Gruesse,
       CK

      1. Hoi romy,

        foreach($feld as $wert)
        {
          echo $i;
          echo $wert."<br />";
          $i++;
        }

        da er ja von anfang an durchzählt enthält $i immer den
        index,

        Nein. Die Reihenfolge, in der man die Elemente in einem
        foreach()-Durchlauf bekommt, ist nicht definiert.

        das war mir nicht bewusst, aber gut zu wissen
        na ich dachte mir schon dass da irgendwas zu einfach war
        danke

        ciao romy

        Gruesse,
        CK

        --
        DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
      2. Hi Christian,

        da er ja von anfang an durchzählt enthält $i immer den
        index,

        Nein. Die Reihenfolge, in der man die Elemente in einem
        foreach()-Durchlauf bekommt, ist nicht definiert.

        Liegen die Elemente als einfache verkettete Liste vor, oder als Baumstruktur, z.B. B+Tree?

        Tom

        1. Hallo Thomas Schmieder,

          Liegen die Elemente als einfache verkettete Liste vor, oder
          als Baumstruktur, z.B. B+Tree?

          Weder noch. Als Hashtable.

          Gruesse,
           CK

    2. Hallo Romy,

      foreach($feld as $wert)
      {
        echo $i;
        echo $wert."<br />";
        $i++;
      }

      da er ja von anfang an durchzählt enthält $i immer den index,aber
      ich vermute das meinst Du nicht, aber wie meinst du es dann, in welcher Form brauchst du den index während der ausgabe???

      Das ist leider nicht so. Da dem Array mit unset() in Element geklaut wurde, ist dort jetzt eine Indexlücke. Wenn man unter dem gleichen Index mit $feld[index]="neuer Wert" wieder einen Wert zuweist, dann wird dieser am Ende der Kette eingefügt, aber mit der alten Index-Nummer.

      Ich habe noch alte Scripte, die mit unset() und Zuweisung arbeiten und nun um eine kleine Funktion ergänzt werden sollten. Das geht aber leider nicht, wenn ich den Index nicht ermitteln kann.

      Du hast in Deiner Lösung nur die Elemente gezählt während der Verarbeitung mit foreach89. Foreach() kann ich aber nicht einsetzen, da es die übergebenen Argumente kapselt, also nur _innerhalb_ des  foreach-Blockes zur Verfügung stellt. Ich brauche sie aber auch außerhalb, muss daher mit for( ...) arbeiten.

      Grüße

      Tom

      1. Hallo!

        Das ist leider nicht so. Da dem Array mit unset() in Element geklaut wurde, ist dort jetzt eine Indexlücke. Wenn man unter dem gleichen Index mit $feld[index]="neuer Wert" wieder einen Wert zuweist, dann wird dieser am Ende der Kette eingefügt, aber mit der alten Index-Nummer.

        Wenn die Index-Nummer stört, dann kopiere den Array einfach mit http://www.php3.de/manual/de/function.array-values.php und Du hast einen frischen Index. Oder Du verwendest in der Schleife http://www.php3.de/manual/de/function.array-key-exists.php, um jedesmal zu prüfen ob der Schlüssel ($i) existiert. Aber die Varianten in meinem Posting oben sind denke ich besser.

        Grüße
        Andreas

        1. Hi,

          Wenn die Index-Nummer stört, dann kopiere den Array einfach mit http://www.php3.de/manual/de/function.array-values.php und Du hast einen frischen Index.

          Das merke ich mir. Ist schon mal in die richtige Richtung.

          Oder Du verwendest in der Schleife http://www.php3.de/manual/de/function.array-key-exists.php, um jedesmal zu prüfen ob der Schlüssel ($i) existiert. Aber die Varianten in meinem Posting oben sind denke ich besser.

          Geht leider erst ab 4.1.?
          Ich habe hier noch 4.0.4 - Systeme. Noch kann ich nicht upgrade.

          Nochmals Dank

          Tom

          1. Hi!

            Geht leider erst ab 4.1.?
            Ich habe hier noch 4.0.4 - Systeme. Noch kann ich nicht upgrade.

            Bei sowas hilft meist(wie in diesem Fall) ein Blick in die Kommentare, da stehen meist zig Workarounds, aber das einfachste wäre ja an Stelle von

            if (array_key_exists...)

            einfach

            if(isset($array[$i]))

            Grüße
            Andreas

  3. Hallo!

    ich habe ein numerisches Array:

    $feld=array("Hund","Katze","HUhn","Kater");

    Ich lösche ein Element mit unset($feld[2]);

    Ich gebe das Array mit

    foreach($feld as $wert)
    {
      echo $wert."<br />";
    }

    Da gäbe es z.B.:

    foreach ($feld as $key => $value){
        echo $key.": ".$value."<br />";
    }
    http://www.php3.de/manual/de/control-structures.foreach.php

    oder auch

    foreach($feld as $wert)
    {
      $key = array_keys ( $feld, $wert);
      echo $key[0].": ".$wert."<br />";
    }
    http://www.php3.de/manual/de/function.array-keys.php

    Grüße
    Andreas

    1. Hi Andreas,

      es wäre zu schön gewesen...

      ich habe ein numerisches Array:

      Da gäbe es z.B.:

      foreach ($feld as $key => $value){
          echo $key.": ".$value."<br />";
      }
      oder
      foreach($feld as $wert)
      {
        $key = array_keys ( $feld, $wert);
        echo $key[0].": ".$wert."<br />";
      }

      Die zweite Möglichkeit sah auf den ersten Blick verlockend aus. Leider bezieht sie sich auch auf ein assoziatives Array, also mehrdimensional. Ich habe aber nur numereische Arrays, also eindimensionale, so wie si z.B. durch $datei=file("Dateiname"); erzeugt werden.

      Schade!

      Trotzdem vielen Dank

      Tom

      1. Hi!

        Die zweite Möglichkeit sah auf den ersten Blick verlockend aus. Leider bezieht sie sich auch auf ein assoziatives Array, also mehrdimensional. Ich habe aber nur numereische Arrays, also eindimensionale, so wie si z.B. durch $datei=file("Dateiname"); erzeugt werden.

        Bei mir klappt beides:

        <?php
        $array = array ("grün","rot","gelb");
        $key = array_keys ($array,"gelb");
        echo $key[0]."\n\n";

        foreach ($array as $key => $value){
            echo "$key: $value\n";
        }
        ?>

        Grüße
        Andreas

        1. Frudiges Hallo nochmal,

          <?php
          $array = array ("grün","rot","gelb");
          $key = array_keys ($array,"gelb");
          echo $key[0]."\n\n";

          foreach ($array as $key => $value){
              echo "$key: $value\n";
          }
          ?>

          Es ist tatsächlich so, dass es funktioniert. Ich bin positiv überrascht. Nun hast Du baer bestimmt einen Schokoweihnachtsmann verdient.

          Tom

          <img src="http://www.rerei.de/wutzblatt_archiv/wdf/naughty.gif" border="0" alt="">

    2. Da gäbe es z.B.:

      foreach ($feld as $key => $value){
          echo $key.": ".$value."<br />";
      }
      http://www.php3.de/manual/de/control-structures.foreach.php

      oder auch

      foreach($feld as $wert)
      {
        $key = array_keys ( $feld, $wert);
        echo $key[0].": ".$wert."<br />";
      }
      http://www.php3.de/manual/de/function.array-keys.php

      Hallo,

      oder auch:

      while (list($key, $value) = each($feld)) {
          echo $key.": ".$wert."<br>";
      }

      Gruß
      Wolfgang