Marcel: Probleme Array zu sortieren bzw. es sortiert auszugeben

Hallo,

ich habe ein Problem, welches sich wahrscheinlich relativ einfach lösen lässt, vor allem für erfahrenere Hasen.

Ich lese eine Reihe von Daten in ein Array und gebe da Array zu einem späteren Zeitpunkt an anderer Stelle aus. Die Ausgabe gestalte ich durch Folgendes:

for ($i = 0; $i < arsize($meinArray); $i++)
  print 'Hier steht dann was, dessen Wert ist: '.$meinArray[$i];

Ein natsort(); zum Beispiel ist relativ sinnlos, da ich mit $i auf den index zugreife und egal, in welcher Reihenfolge das Array auch sortiert ist (natsort, rnatsort, ksort, etc), ich erhalte immer die selbe Ausgabe. (Logischerweise ;-)

Was ich suche ist eine Funktion, die mein Array derart sortiert, dass ich beim Zugriff über den Index eine sortierte Ausgabe erhalte. Ich hoffe, es kann mir jemand von euch helfen. Danke.

Gruß,
Marcel

  1. Hallo Marcel,

    Was ich suche ist eine Funktion, die mein Array derart sortiert, dass ich beim Zugriff über den Index eine sortierte Ausgabe erhalte. Ich hoffe, es kann mir jemand von euch helfen. Danke.

    wonach und wie soll das Array denn sortiert werden?
    Aus deinem Posting entnehme ich, dass das Array einen numerischen Index hat - richtig?

    Gruß Gunther

    1. Hallo Marcel,

      Hallo Gunther,

      wonach und wie soll das Array denn sortiert werden?
      Aus deinem Posting entnehme ich, dass das Array einen numerischen Index hat - richtig?

      Richtig. Eingelesen wird einfach (ebenfalls in einer Schleife) per: $meinArray[] = irgendeinString;

      Das Array hat also einen numerischen Index. Sortiert werden sollen nun die eingelesenen Strings. Würde ich natsort darauf anwenden und das Array per print_r ausgeben, dann hätte ich genau was ich suche. Das Problem ist, dass print_r gleich alles ausgibt. Ich möchte aber jedem Wert etwas voranstellen, wie schon im ersten Post geschrieben.

      for ( ... )
        print 'Hier soll noch was stehen: '.$meinArray[$i];

      Und mit dem $i greife ich halt wieder auf den numerischen Index und das ganze sortiere hatte Null Effekt. Was ich also suche ist etwas, dass die Werte sortiert, so wie es natsort macht, dann aber zusätzlich den numerischen Index neu anlegt, so dass ich mit meiner For-Schleife darauf zugreifen kann und trotzdem eine sortierte Ausgabe erhalte.

      Gruß,
      Marcel

      1. hi marcel,

        ähmn, klar kannst du das wunderbar mit natsort() machen. du musst halt nur mit deiner for-schleife über das ergebniss iterieren, also so:

        $sortiertes_array = natsort($meinArray);

        for ($i = 0; $i < count($sortiertes_array)-1; $i++)
          print 'Hier soll noch was stehen: '.$meinArray[$i];

        gruss,
        Robbe.

        1. kleine Korrektur:

          print 'Hier soll noch was stehen: '.$meinArray[$i];

          -> muss nat. dann auch sort $sortiertes_array zugreifen:

          print 'Hier soll noch was stehen: '.$sortiertes_array[$i];

          ;)

          1. Hallo,

            und vielen Dank für eure Antworten zu so später Uhrzeit. :-)

            kleine Korrektur:

            print 'Hier soll noch was stehen: '.$meinArray[$i];

            -> muss nat. dann auch sort $sortiertes_array zugreifen:

            print 'Hier soll noch was stehen: '.$sortiertes_array[$i];

            ;)

            Einfach wie brilliant. Auf die Idee bin ich irgendwie noch nicht gekommen. Auch Gunthers Idee mit foreach zu arbeiten ist mir nicht in den Sinn gekommen. Offenbar sind meine gedanklichen Bahnen um diese Uhrzeit mächtig verklebt.

            Also, vielen Dank noch einmal an euch beide. Ich werd mir nun eine Mütze Schlaf gönnen und das ganze dann morgen einarbeiten.

            Gute Nacht euch.
            Marcel

        2. Tach.

          $sortiertes_array = natsort($meinArray);

          Und das funktioniert? Je nach Version gibt natsort() void oder bool zurück. Was du später bei der Ausgabe von $sortiertes_array probierst, sollte in keiner mir bekannten Version von PHP funktionieren, da $sortiertes_array gar kein Array ist ...

          --
          Once is a mistake, twice is jazz.
          1. $sortiertes_array = natsort($meinArray);

            Und das funktioniert? Je nach Version gibt natsort() void oder bool zurück.

            du hast recht! was hab ich gestern nur für ein scheiss geschribbe ;) das array wird nat. als referenz der funktion übergeben.

            der einzige unterschied zwischen usort und natsort im ergebnis ist nur das die Schlüssel-Wert-Zuordnung beibehalten wird, was durchaus vlt. gewünscht ist, k.a. auf jeden fall bietet sich zum ausgeben bei natsort nicht mehr die for-schleife an, sondern foreach wie gunther es schon richtig erwähnte..

            hier zu vollständigkeit ein bespiel was dies verdeutlichen soll:

            $array_natsort = $array_usort = array("img12.png", "img10.png", "img2.png", "img1.png");

            natsort($array_natsort);
            usort($array_usort, "strnatcmp");

            print "sortierung mit natsort: <br>";
            foreach($array_natsort as $key=>$value) {
             print "array[{$key}]: {$value}<br>";
            }

            print "<br>sortierung mit usort: <br>";
            for($i=0; $i < count($array_usort); $i++) {
             print "array[{$i}]: {$array_usort[$i]}<br>";
            }

            gruss,
            robbe

      2. Hallo Marcel,

        Das Array hat also einen numerischen Index. Sortiert werden sollen nun die eingelesenen Strings. Würde ich natsort darauf anwenden und das Array per print_r ausgeben, dann hätte ich genau was ich suche.

        du kannst dein sortiertes Array auch per foreach ausgeben.

        Gruß Gunther

  2. Tach.

    Ein natsort(); zum Beispiel ist relativ sinnlos, da ich mit $i auf den index zugreife und egal, in welcher Reihenfolge das Array auch sortiert ist (natsort, rnatsort, ksort, etc), ich erhalte immer die selbe Ausgabe. (Logischerweise ;-)

    Was ich suche ist eine Funktion, die mein Array derart sortiert, dass ich beim Zugriff über den Index eine sortierte Ausgabe erhalte. Ich hoffe, es kann mir jemand von euch helfen. Danke.

    Wenn ich dich richtig verstanden habe, solltest du dein Array mit ...

    usort($a, "strnatcmp");

    ... sortieren. Das sortiert die Stringeinträge des Arrays nach "natural order" und weist die numerischen Schlüssel neu zu.

    --
    Once is a mistake, twice is jazz.