Solero: komischer Wert für key() in einer foreach-Schleife

Hey Leute,
bin auf ein interessantes (zumindest für mich...) Problem in PHP gestossen. vielleicht wisst ihr, wieso das nicht richtig funktioniert. und zwar gehts um folgenden Code:

<?php  
$arr = array ('a', 'b', 'c', 'd', 'e');  
$file = 'b';  
  
foreach ( $arr as $x )  
{  
if ($x == $file)  
$key = key($arr);  
}  
  
echo $key  
?>

echo $key gibt mir nun den Wert 2 aus, obwohl doch das Element 'b' eindeutig den Index 1 hat, was ich auch mit print_r($arr) überprüft habe. auch für andere Werte von $file ist $key immer um 1 zu gross, ausser für $file = 'e', da ist $key = 0.

Ich bin das Problem nun mit

<?php  
foreach ($arr as $k => $b)  
if ($b == $file)	  
$key = $k;  
?>

umgangen, dennoch würde mich interessieren, wieso die erste Variante nicht richtig funktioniert.

mfG
Solero

  1. Hi,

    <?php

    $arr = array ('a', 'b', 'c', 'd', 'e');
    $file = 'b';

    foreach ( $arr as $x )
    {
    if ($x == $file)
    $key = key($arr);
    }

    echo $key
    ?>

    
    >   
    > echo $key gibt mir nun den Wert 2 aus, obwohl doch das Element 'b' eindeutig den Index 1 hat, was ich auch mit print\_r($arr) überprüft habe. auch für andere Werte von $file ist $key immer um 1 zu gross, ausser für $file = 'e', da ist $key = 0.  
      
    <http://www.php.net/manual/en/control-structures.foreach.php>:  
    “On each loop, the value of the current element is assigned to $value and the internal array pointer is advanced by one”  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Danke Chris,

      http://www.php.net/manual/en/control-structures.foreach.php:
      “On each loop, the value of the current element is assigned to $value and the internal array pointer is advanced by one”

      sowas hatte ich mir schon +/- gedacht, aber wieso wird der Wert schon vor meiner if()-Funktion um 1 erhöht? Sprich wie müsste man den Code anpassen, um das richtige Ergebnis zu erhalten?

      mfG
      Solero

      1. Hi,

        http://www.php.net/manual/en/control-structures.foreach.php:
        “On each loop, the value of the current element is assigned to $value and the internal array pointer is advanced by one”
        sowas hatte ich mir schon +/- gedacht, aber wieso wird der Wert schon vor meiner if()-Funktion um 1 erhöht?

        Weil das zitierte zwei Dinge beschreibt, die *vor* dem Eintritt in den Codeblock der Schleife passieren.

        Sprich wie müsste man den Code anpassen, um das richtige Ergebnis zu erhalten?

        So, wie du es im zweiten Versuch bereits gemacht hast.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. n'Abend

          Sprich wie müsste man den Code anpassen, um das richtige Ergebnis zu erhalten?

          So, wie du es im zweiten Versuch bereits gemacht hast.

          wozu gibt es denn die sch****-Funktion key()?! :-) Neh will damit mehr sagen, dass ich diese nicht wirklich kenne, es im Manual (auf Deutsch^^) nicht unbrauchbar geklungen hat und ich sie deshalb mal ausprobiert habe.

          Bin aber fast ein bisschen stolz dass mein zweites Eigengewurstel +/- korrekt ist =)

          MfG
          Solero

          1. Hi,

            wozu gibt es denn die sch****-Funktion key()?!

            Um sich zusammen mit anderen Funktionen wie prev, current, next etc. einen Loop selber zu basteln, wenn man Bedarf dafür hat.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          2. Hi!

            wozu gibt es denn die sch****-Funktion key()?! :-)

            Die gibt es schon länger als foreach. foreach - mit PHP 4 hinzugekommen - ist nicht mehr kompatibel zur bis dato allein geltenden Philosophie des Array-Pointers. Damals setzte man noch ausschließlich den Array-Pointer mit next() und each() weiter. Heute interessiert der Array-Pointer nicht mehr wirklich und die Funktionen current(), each(), end(), key(), next(), prev() und reset() sind zugunsten von foreach nahezu bedeutungslos geworden.

            Bin aber fast ein bisschen stolz dass mein zweites Eigengewurstel +/- korrekt ist =)

            Entschuldige bitte meine Abgeklärtheit, aber die beiden Formen (mit und ohne Key) stehen doch in jeder Dokumenation zu foreach.

            Lo!

          3. Hi.

            Bin aber fast ein bisschen stolz dass mein zweites Eigengewurstel +/- korrekt ist =)

            Sollte Dein Anwendungsfall tatsaechlich Deinem Beispiel entpsrechen, dann koennte

            1.: ein anderes Array-Dasign nuetzlicher sein (muss aber nicht, je nachdem, was Du sonst noch mit dem Array treibst)

            2.: Dich die Funktion array_search evtl. interessieren.

            Viele Gruesse,
            der Bademeister

          4. Hi,

            wozu gibt es denn die sch****-Funktion key()?! :-) Neh will damit mehr sagen, dass ich diese nicht wirklich kenne, es im Manual (auf Deutsch^^) nicht unbrauchbar geklungen hat und ich sie deshalb mal ausprobiert habe.

            Ich versteh den zweiten Satz beim besten Willen nicht. Um deine Frage zu beantworten: es ist, wie bereits erwähnt, stellt key() zusammen mit seinen Geschwistern next(), current(), each() und reset() eine alternative (und alte) Syntax bereit, um Arrays zu iterieren.

            Dein Beispiel aus deinem Eingangsposting findest du übrigens "korrekt" (d.h.: wie du es erwartest) umgesetzt in der Dokumentation zu key.
            Dorst siehst du auch, dass das next(), welches, wie von ChrisB erwähnt, auch innerhalb von foreach implizit genutzt wird, um den Iterator nach vorne zu schieben, am Ende der while-Schleife notiert wird, damit key() den aktuellen Index des Arrays ermitteln kann.

            Bis die Tage,
            Matti