Connor: Eigene Funktion geht nicht

Hallöchen zusammen,
ich möchte das Ersten und Letzte Value aus einem Array($stack) rausfiltern und
damit weiterarbeiten ($paar). Ausserdem soll das $stack die entfernten Values nicht mehr enthalten.

Das klappt auch mit:

  
$stack = range(1, 16);  
$paar = array(array_shift($stack),(array_pop($stack)));  

$paar enthält nun 1 und 16
$stack enthält nun 2 bis 15

Nun wollte ich das mit folgender Funktion automatisieren:

  
function first_last_hold ($array)  
{  
$array = array(array_shift($array),(array_pop($array)));  
return $array;  
}  
  
$paar = first_last_hold($stack);  

$paar enthält nun 1 und 16

ABER:
$stack enthält 1 bis 16, also das Anfangs-Array !

Bin für jeden Tip dankbar, da es meine Erste eigene Funktion ist

Gruss Connor

  1. function first_last_hold (&$array)
    {
    $array = array(array_shift($array),(array_pop($array)));
    return $array;
    }

    $paar = first_last_hold($stack);

      
    Was ausrichten tut ein Zeichen du lernen musst, kleiner Padaban.  
    Nennen wir Referenz, du wissen jetzt.  
      
    Meister  
    T-Rex  
    Gruß
    
    1. Moin

      Was ausrichten tut ein Zeichen du lernen musst, kleiner Padaban.

      ^^^^^^^^
      Falsch du ihn bezeichnet hast. Pada_w_an er als Schüler genannt wird. Du noch viel lernen oder Filmen besser zuhören lernen musst. ;)

      Gruß Bobby

      --
      -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
      ### Henry L. Mencken ###
      -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
      ## Viktor Frankl ###
      ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
      1. Was ausrichten tut ein Zeichen du lernen musst, kleiner Padaban.
                                                                  ^^^^^^^^
        Falsch du ihn bezeichnet hast. Pada_w_an er als Schüler genannt wird. Du noch viel lernen oder Filmen besser zuhören lernen musst. ;)

        Gesehen er nun hat, was ausrichten kann ein falsches Zeichen :p

        Yoda spricht "Basic" - das Objekt kommt vor dem Subjekt - wie ein Tschutsch reden muss man deshalb aber trotzdem nicht :p

        1. de.selfstarwars.org

          :D

        2. Hi there,

          [...] - wie ein Tschutsch reden muss man deshalb aber trotzdem nicht :p

          Tschutsch - reden die Salzburger wirklich so komisch?

          1. Tschutsch - reden die Salzburger wirklich so komisch?

            Ja, wir sagen auch Tomaten statt Paradeiser :p

    2. Hallo T-Rex,

      vielen lieben Dank, Nun klappt es :-)

      function first_last_hold (&$array)
      {

      
      >   
      > Was ausrichten tut ein Zeichen du lernen musst, kleiner Padaban.  
      > Nennen wir Referenz, du wissen jetzt.  
      >   
      
      Wenn Du noch so nett wärest, mir zu erklären, was das & in der Funktion bewirkt, dann verstehe ich es auch :-)  
        
      Danke Dir  
        
      Gruss Connor
      
      1. Hi T-Rex

        Ich muss mich/dich berichtigen.

        Dein Vorschlag geht leider doch nicht

        1. function first_last_hold (&$array)
          {
          $array = array(array_shift($array),(array_pop($array)));
          return $array;
          }

          »»

          $paar = first_last_hold($stack);

          »»»» Hi T-Rex
          »»»»
          »»»» Ich muss mich/dich berichtigen.
          »»»»
          »»»» Dein Vorschlag geht leider doch nicht

          T-Rex hat recht, du solltest dir mal Referenzen anschauen insbesondere bei Funktion (Stichwort CallByReference).

          Allerdings hat die Funktion wie oben angegeben einen kleinen Logikfehler.
          Die reference-Variable wird nämlich überschrieben, deshalb enthält die Variable $stack auch nach dem ersten Funktionsaufruf ein Array mit den Werten 1,16 und nicht wie gewünscht 2,...,15

          Bedenke, dass mit "return" der Wert "kopiert" wird. Wenn ich aber einen Wert als Referenz returnieren will, muss ich das deklarieren. Vor dem definitions-Funktionsnamen gehört dann noch ein "&"-Zeichen und bei der Wertzuweisung durch die Funktion gehört auch noch ein "&"-Zeichen zwischen Zuweisungsoperator und Funktionsaufruf.

          Das ganze sähe dann so aus. (ist nur ein Beispiel)

            
          function &test()  
          {  
            $a = 1;  
            return $a;  
          }  
            
          $b =& test();  
          
          

          Bedenke auch, dass es nicht zwingend Sinn macht eine Parameterreferenz zu returnieren, da der Wert der Refenzvariable auch direkt in der Variable ausserhalb der Funktion geändert wird.

          Beispiel:

            
          $b = 1;  
            
          function test2(&$a)  
          {  
            ++$a; //ohne return, da der Wert auch direkt in $b geändert wird  
          }  
          test2($b);  
            
          echo $b; //Ausgabe -> 2  
          
          

          Zurück zu deinem Problem:
          So sollte es funktionieren. $stack/$array wird nicht überschrieben und die Funktion gibt ein Array mit den zwei gewünschten Werten zurück.

            
          function first_last_hold(&$array)  
          {  
          	return Array(array_shift($array),(array_pop($array)));  
          }  
            
          $stack = range(1, 16);  
          $paar = first_last_hold($stack);  
          
          

          Gruß Metalgurke

          1. Hi!

            T-Rex hat recht, du solltest dir mal Referenzen anschauen insbesondere bei Funktion (Stichwort CallByReference).

            Abgesehen vom Fehler wäre noch interessant, warum T-Rex überhaupt die Referenz ins Spiel bringt. Referenzen sollte man nicht verwenden, wenn man einen Geschwingkeits- oder Speichersparvorteil im Sinn hat, sondern wenn es eine programmtechnische Notwendigkeit gibt. PHP ist bereits clever genug, nur dann Kopien anzulegen, wenn dies erforderlich wird, sprich: Werte auseinanderlaufen. Eine Zuweisung oder eine Übergabe per Wert ist zunächst intern keine Kopie sondern ähnlich einer Referenz. http://derickrethans.nl/php-references-article.html

            Lo!

          2. Huhu Metalgurke (wie kommt man auf so einen Nick? *grins )

            Zurück zu deinem Problem:
            So sollte es funktionieren. $stack/$array wird nicht überschrieben und die Funktion gibt ein Array mit den zwei gewünschten Werten zurück.

            function first_last_hold(&$array)
            {
            return Array(array_shift($array),(array_pop($array)));
            }

            $stack = range(1, 16);
            $paar = first_last_hold($stack);

            
            >   
              
            Es klappt suppiiiiiiiiiiiiii.  
              
            Werde mir auf jeden Fall deine gesammte Beschreibung/Erklärung noch in aller Ruhe ansehen und testen.  
              
            Lieben Dank für Deine Hilfe  
              
            Grüsserle Connor