Constantin Kiesling: Array sortieren

Hallo liebe Community!

Ich habe ein Problem: Der Array $incl_punkte soll nach den Keys rückwärts geordnet werden, um dann in dieser Reihenfolge ausgegeben zu werden. Leider funktioniert das bei mir nicht... als Beweis für mich selbst, habe ich dieses Beispiel erstellt, bei dem der Array zuerst ungeordnet und dann geordnet mit einer for-Schleife ausgegeben wird.

for ($d = 0; $d < $incl_eintraege; $d++) {
  $incl_doppelpunkte = $incl_punkte[$d];
  print ("$incl_doppelpunkte<br>\n");
 }

krsort ($incl_punkte); // Sortiert den Array mit den Doppel-Punkt Eintraegen rueckwaerts
 reset ($incl_punkte);

for ($c = 0; $c < $incl_eintraege; $c++) {
  $incl_doppelpunkte = $incl_punkte[$c];
  print ("$incl_doppelpunkte<br>\n");

//include ("");
 }

Bei mir werden die Arrayeinträge jedenfalls bei beiden Schleifen in der selben Reihenfolge ausgegeben... kann mir irgendwer vielleicht sagen, was ich falsch gemacht habe? Ich würde mich wirklich freuen!

MfG,
Consti

  1. PS: Sorry, das "//include..." im unteren Teil des Codes ist nur ein unwichtiger Schnipsel (ist eh als Kommentar dargestellt).

    Consti

  2. Moin!

    Ich habe ein Problem: Der Array $incl_punkte soll nach den Keys rückwärts geordnet werden, um dann in dieser Reihenfolge ausgegeben zu werden.

    Kannst du mal mit print_r($incl_punkte) einen Beispielinhalt angeben? Hilft immer sehr, weil dein Array ja auch dumme Daten enthalten kann, die nicht dem entsprechen, was die Funktion erwartet.

    Leider funktioniert das bei mir nicht... als Beweis für mich selbst, habe ich dieses Beispiel erstellt, bei dem der Array zuerst ungeordnet und dann geordnet mit einer for-Schleife ausgegeben wird.

    Summa summarum: Du hast zwei FOR-Schleifen, die jeweils von Null bis zu einer Zahl zählen und den jeweiligen Array-Index ausgeben.

    Wenn du so vorgehst, wirst du den Sortiereffekt niemals sehen. Weil ein unsortiertes Array:
    key  value
    3    lala
    4    lele
    1    lili
    2    lulu
    0    lolo

    Damit genauso sortiert von 0 bis 4 ausgegeben wird, wie ein sortiertes Array. Es ist ja Sinn und Zweck eines Arrays, eine gewisse Selbstsortierung zu enthalten.

    krsort() macht, wie das Manual schon sagt, nur dann Sinn, wenn du wirklich assoziative Arrays mit Schlüsseln hast - nicht normale numerische Indices!

    for ($d = 0; $d < $incl_eintraege; $d++) {
      $incl_doppelpunkte = $incl_punkte[$d];
      print ("$incl_doppelpunkte<br>\n");

    Und noch eine dumme Frage: Warum das Gehampel mit $incl_doppelpunkte? Einfach
    print ($incl_punkte[$d]."<br>\n");
    und fertig.

    }

    krsort ($incl_punkte); // Sortiert den Array mit den Doppel-Punkt Eintraegen rueckwaerts
     reset ($incl_punkte);

    - Sven Rautenberg

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
    1. Hallo,

      Mein Array $incl_punkte enthält in jedem Eintrag verschieden viele Doppel-Punkte, mit denen man ein Verzeichnis weiter rauf kommt, z.B. so:

      key  value
      0    ../
      1    ../../
      2    ../../../
      3    ../../../../

      Ich brauche die Einträge beim Ausgeben aber in umgekehrter Reihenfolge, weil ich zuerst den Eintrag mit den meisten Doppel-Punkten benötige... und so weiter in absteigender Reihenfolge.

      By the way... gibt es für diese Doppel-Punkte denn einen professionellen Ausdruck?

      Damit genauso sortiert von 0 bis 4 ausgegeben wird, wie ein sortiertes Array. Es ist ja Sinn und Zweck eines Arrays, eine gewisse Selbstsortierung zu enthalten.

      Das ist mir jetzt erst klar geworden, vielen Dank! Eigentlich wirklich dumm, dass ich da nicht selbst draufgekommen bin. Tut mir Leid wegen des Stumpfsinns.

      krsort() macht, wie das Manual schon sagt, nur dann Sinn, wenn du wirklich assoziative Arrays mit Schlüsseln hast - nicht normale numerische Indices!

      Verstehe! Aber siehst du sonst irgendeine Möglichkeit, wie man meinen Array in umgekehrter Reihenfolge ausgeben kann?

      Vielleicht so: for ($a = $eintraege; $a < $eintraege; $d--) ?

      Und noch eine dumme Frage: Warum das Gehampel mit $incl_doppelpunkte? Einfach
      print ($incl_punkte[$d]."<br>\n");
      und fertig.

      Was soll ich dir darauf antworten? Ich werds in Zukunft auf deine Art machen, ich weiß eigentlich auch nicht wieso ich so einen Blödsinn schreibe.

      MfG,
      Consti

      1. Vielleicht so: for ($a = $eintraege; $a < $eintraege; $d--) ?

        Ach nein, Mist, es müsste wohl so heißen:

        for ($a = $eintraege; $a > 0; $a--)

      2. Moin!

        Mein Array $incl_punkte enthält in jedem Eintrag verschieden viele Doppel-Punkte, mit denen man ein Verzeichnis weiter rauf kommt, z.B. so:

        key  value
        0    ../
        1    ../../
        2    ../../../
        3    ../../../../

        Ok, aber warum brauchst du dafür überhaupt ein Array? PHP hat so viele schöne Funktionen.

        Die simpelste Methode:

        function levelup ($level)
        {
          for ($i = 0; $i<$level; $i++)
          {
            echo "../";
          }
        }

        An passender Stelle mit levelup(4); aufrufen, um ../../../../ zu erhalten.

        Schöner ist es, wenn du innerhalb von Funktionen nicht mit echo arbeitest, sondern ein Ergebnis an die aufrufende Stelle zurückgibst:

        function levelup ($level)
        {
          $string = "";
          for ($i = 0; $i<$level; $i++)
          {
            $string.= "../";
          }
          return $string;
        }

        Ausgeben mit:
        echo levelup(3);

        Geht auch "mittendrin":
        echo "<a href='".levelup(3)."'>Link</a>";

        Und die tollen Funktionen von PHP erlauben es unter anderem, einen String eine beliebige Anzahl zu vervielfachen:

        http://de3.php.net/manual/de/function.str-repeat.php

        echo "<a href='".str_repeat('../',3)."'>Link</a>";

        Verstehe! Aber siehst du sonst irgendeine Möglichkeit, wie man meinen Array in umgekehrter Reihenfolge ausgeben kann?

        Vielleicht so: for ($a = $eintraege; $a < $eintraege; $d--) ?

        Das ist grob gesehen der richtige Weg.

        Und noch eine dumme Frage: Warum das Gehampel mit $incl_doppelpunkte? Einfach
        print ($incl_punkte[$d]."<br>\n");
        und fertig.

        Was soll ich dir darauf antworten? Ich werds in Zukunft auf deine Art machen, ich weiß eigentlich auch nicht wieso ich so einen Blödsinn schreibe.

        Hätte ja einen Grund haben können. Aber es ist eben Zeichen eines guten Programmierstils, nicht Variablen sinnlos und ohne Veränderung hin- und herzukopieren. Der Direktzugriff ist immer schneller - und er spart auch Speicher. Das mag bei so simplen Dingen nicht entscheidend sein - aber wenn du aus reiner Gewohnheit eine Megabyte-Datenbank einfach mal so umkopierst, wird sich das dann irgendwann doch bemerkbar machen. :)

        - Sven Rautenberg

        --
        Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
        1. Hallo,

          Schöner ist es, wenn du innerhalb von Funktionen nicht mit echo arbeitest, sondern ein Ergebnis an die aufrufende Stelle zurückgibst:

          function levelup ($level)
          {
            $string = "";
            for ($i = 0; $i<$level; $i++)
            {
              $string.= "../";
            }
            return $string;
          }

          Das gefällt mir gut! Ist der Punkt nach $string in der vierten Zeile von unten Absicht oder ein Tippfehler?

          MfG,
          Consti

          1. Moin!

            Das gefällt mir gut! Ist der Punkt nach $string in der vierten Zeile von unten Absicht oder ein Tippfehler?

            Absicht!

            $string  = "text";
            $string .= "anhang";

            echo $string;  // "textanhang"

            .= gehört genauso in die Kategorie "platzsparendes Programmieren" wie +=, -= und Konsorten.

            Es ersetzt:
            $string = $string . "anhang";

            - Sven Rautenberg

            --
            Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
            1. Hallo nochmal,

              Es ersetzt:
              $string = $string . "anhang";

              Gut, verstehe... eigentlich hab ich auch das bisher immer auf die umständlichere Methode gemacht.

              Eine Frage hab ich noch: Wenn ich dann die Funktion levelup ausgebe mit print oder echo sieht das auf deine Art so aus:

              echo levelup(4);

              Aber was, wenn ich die Klammern der echo-Funktion dazunehmen möchte... geht das dann trotzdem? z.B:

              echo (levelup(4));

              MfG,
              Consti

              1. Moin!

                Aber was, wenn ich die Klammern der echo-Funktion dazunehmen möchte... geht das dann trotzdem? z.B:

                echo (levelup(4));

                Schon mal ausprobiert?

                - Sven Rautenberg

                --
                Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
                1. Hi,

                  echo (levelup(4));

                  Schon mal ausprobiert?

                  Ja, siehe da - es klappt. PHP ist ja doch schlauer als ich dachte. :)

                  Danke vielmals für die große Hilfe!

                  MfG,
                  Consti

          2. Hallo Constantin,

            for ($i = 0; $i<$level; $i++)
              {
                $string.= "../";
              }
              return $string;
            }
            Das gefällt mir gut! Ist der Punkt nach $string in der vierten Zeile von unten Absicht oder ein Tippfehler?

            Absicht. Damit wird bei jedem Durchlauf der for-Schleife an den aktuellen Inhalt von $string der String "../" angehängt, siehe auch http://de2.php.net/language.operators.string.

            Grüße aus Nürnberg
            Tobias

            --
            Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|