[Variablen] Referenzen im Array tauschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Variablen] Referenzen im Array tauschen

    Hi Leute

    folgender Funktionsabschnitt:
    PHP-Code:
    if( is_array$arr ) ) {
        
    $nArr = array();
        foreach( 
    $arr as $k=>$v ) {
            
    $nArr[] = &$arr[$k];
            unset( 
    $arr[$k] );
        }
        foreach( 
    $nArr as $k=>$v ) {
            
    $arr[] = &$nArr[];
        }
        return( 
    $arr );

    sortiert mir ein Array, in dem es Lücken in der Durchnummerierung in den Schlüsseln gibt, neu zusammen, so dass die Indizes wieder sauber durchnummeriert sind!

    Im Grunde ja kein Problem, die Sache ist nur, die Objekte im Array $arr dürfen nicht verloren gehen! Darum weise ich den einzelnen Elementen in $nArr auch in der ersten foreach jeweils Referenzen zu!
    In der zweiten foreach sortiere ich das ganze dann wieder in den Array $arr zurück, da auch dieser eine Referenz auf das Original ist!!
    Das muss so gemacht werden, da ich außerhalb des Arrays Referenzen habe, die durch die Neunummerierung des Arrays nicht verloren gehen dürfen, das Array aber schon wieder richtig durchnummeriert sein sollte!

    In PHP verhalten sich die Referenzen ja leicht anders als in C++ zum Beispiel, kann mir also vllt jemand sagen, ob diese Sortierung so in Ordnung ist?? Ich meine, ob jemand was besseres vorschlagen kann oder nen fehler/problem sieht!

    Vielen Dank leutchens!

  • #2
    $nArr[] = &$arr[$k];
    in $nArr[?] ist nicht nur gleiche wert, sondern immer der wert der in $arr[$k] steht

    unset( $arr[$k] );
    wenn in $arr[$k] nichts steht, dann gibt es auch in $nArr[?] nichts.

    http://de2.php.net/manual/de/language.references.php
    Zuletzt geändert von Slava; 12.09.2006, 17:17.
    Slava
    bituniverse.com

    Kommentar


    • #3
      reicht dir nicht:
      PHP-Code:
      $neu array_values($lueckenhaft); 
      Wir werden alle sterben

      Kommentar


      • #4
        $nArr[] = &$arr[$k];
        in $nArr[?] ist nicht nur gleiche wert, sondern immer der wert der in $arr[$k] steht

        unset( $arr[$k] );
        wenn in $arr[$k] nichts steht, dann gibt es auch in $nArr[?] nichts.

        http://de2.php.net/manual/de/language.references.php
        Naja, aber dieses Objekt existiert eventuell außerhalb des Arrays nochmal als Referenz auf dieses Arrayelement!
        Ich versuche im Grunde etwas ähnliches, wie ich es in C++ mit Zeigern machen würde, allerdings ist mir nicht ganz klar, was jetzt mit meiner referenz passiert, wenn ich sie im Array umsortiere oder halt unset() drauf anwende!

        Zum Beispiel:
        PHP-Code:
        $a 2;
        $b = &$a;
        $c = &$b;
        unset( 
        $b ); 
        steht jetzt in $c eine Referenz auf $a ???

        Kommentar


        • #5
          ja natürlich!
          damit hast du $c,$a und $b zerstört
          Edit: sorry habe unset falsch interpretiert, da ich statt unset immer $varname=null; mache, da ältere php versionen bei windows mit unset nichts anfangen könnten.
          also ziehe ich mich mit meiner aussage erst mal zurück

          das hier
          foreach( $nArr as $k=>$v ) {
          $arr[] = &$nArr[];
          }
          kann ich leider überhaupt nicht nachvollziehen
          Zuletzt geändert von Slava; 12.09.2006, 17:53.
          Slava
          bituniverse.com

          Kommentar


          • #6
            Original geschrieben von Slava
            ja natürlich!
            damit hast du $c,$a und $b zerstört
            nämlich nicht:
            Wird eine Referenz aufgehoben, so wird nur die Bindung zwischen einem Variablennamen und dem Variableninhalt entfernt. Der Inhalt der Variablen wird hierbei nicht gelöscht. Betrachten wir folgendes Beispiel:

            $a = 1;
            $b =& $a;
            unset ($a);

            Die Variable $b wird nicht gelöscht, sondern es wird nur die Bindung des Variablennamen $a an den Variableninhalt aufgehoben. Dieser Variableninhalt ist immer noch über $b verfügbar.



            Aber liefert mir array_values() denn meine referenzen zurück?? wahrscheinlich ja eher nicht!

            Kommentar


            • #7
              Aber liefert mir array_values() denn meine referenzen zurück?? wahrscheinlich ja eher nicht!
              Naja... unter PHP4 (darüber reden wir ja wohl) .. meines Wissens nach JA!!!!

              Der Nachweis:
              PHP-Code:
              error_reporting(E_ALL);
              ini_set('display_errors'TRUE); // evtl. hilfreich

              class test 
              {
                var 
              $i 0;
                function 
              test($int)
                {
                  
              $this->$int;
                }
              }


              $lueckenhaft = array();
              $lueckenhaft[4] = & new test(4); // nur zum test
              $lueckenhaft[34] = & new test(34); // nur zum test
              $lueckenhaft[1] = & new test(1); // nur zum test
              $lueckenhaft[66] = & new test(66); // nur zum test
              $lueckenhaft[8] = & new test(8); // nur zum test

              $neu array_values($lueckenhaft);

              $neu[0]->4535;

              echo 
              '<pre>';
              var_dump($lueckenhaft);
              echo 
              '</pre>';

              echo 
              '<pre>';
              var_dump($neu);
              echo 
              '</pre>'
              Zuletzt geändert von combie; 12.09.2006, 17:56.
              Wir werden alle sterben

              Kommentar


              • #8
                ich hab php5, aber ich werd mal ausprobieren!

                Kommentar


                • #9
                  Original geschrieben von PHP-Desaster
                  ich hab php5, aber ich werd mal ausprobieren!
                  Dann brauchste dir ja mit Objekten keine Sorgen zu machen!!
                  Unter PHP5 kannste das & bei Objekten weglassen!!
                  Und man muss Objekte explizit Klonen wenn man Kopien
                  erzeugen will!!
                  Wir werden alle sterben

                  Kommentar


                  • #10
                    [...] sortiert mir ein Array, in dem es Lücken in der Durchnummerierung in den Schlüsseln gibt, neu zusammen, so dass die Indizes wieder sauber durchnummeriert sind!
                    mal eine andere frage - wozu braucht man soetwas?

                    Kommentar


                    • #11
                      Original geschrieben von combie
                      Dann brauchste dir ja mit Objekten keine Sorgen zu machen!!
                      Unter PHP5 kannste das & bei Objekten weglassen!!
                      Und man muss Objekte explizit Klonen wenn man Kopien
                      erzeugen will!!
                      Nicht ehrlich oder?? Und warum weiß ich davon nix! Mal wieder typisch

                      Naja, dann haben wir das ja geklärt BESTEN DANK

                      mal eine andere frage - wozu braucht man soetwas?
                      jaja, es gibt ne foreach, da komm ich auch mit den array klar, aber trotzdem hät ich lieber einen sauber durchnummerierten Array! Falls du einen Grund brauchst, es gibt keinen

                      Kommentar


                      • #12
                        hät ich lieber einen sauber durchnummerierten Array!
                        Auch ich, empfinde "sauber durchnummerierte" Arrays, als schöner
                        Zuletzt geändert von combie; 12.09.2006, 23:48.
                        Wir werden alle sterben

                        Kommentar

                        Lädt...
                        X