pl: Array sortieren

problematische Seite

Ich hab da ein Array in dem sind die Elemente assoziative Arrays:

[
 [url => '', title => '', descr => '', class => ''],
 [url => '', title => '', descr => '', class => ''],
 [url => '', title => '', descr => '', class => '']
]

Der besseren Lesbarkeit wegen hab ich das Quoten der Schlüssel mal weggelassen. Wie sieht denn eine Sortierfunktion aus die nach title sortiert?

NFG

  1. problematische Seite

    Hallo Rolf,

    in der Vergleichsfunktion, die <array>.sort mitgegeben wird, vergleichst du nicht a und b, sondern a.title und b.title.

    Edit: Sorry, habe das Schlagwort PHP übersehen.

    Gruß
    Jürgen

    1. problematische Seite

      Danke!

      in der Vergleichsfunktion, die <array>.sort mitgegeben wird, vergleichst du nicht a und b, sondern a.title und b.title.

      Edit: Sorry, habe das Schlagwort PHP übersehen.

      Das Schlagwort lautet Vergleichsfunktion. Aufgabe gelöst 😉

      PS: Das Lustige an php.net ist, daß man immer erstmal goooooogel bemühen muss um da was zu finden.

      1. problematische Seite

        Hallo pl,

        kann helfen, muss aber nicht immer sein. Du darfst auch Bing oder DuckDuckGo bemühen, oder:

        Rolf

        --
        sumpsi - posui - clusi
      2. problematische Seite

        Ok, die Pflicht haben wir, jetzt die Kür: Alle URLs in denen die Eigenschaft $a['isa'] == 'folder' gesetzt ist, sollen ganz unten/hinten stehen.

        Die Sortierung nach title soll beibehalten werden. Idee?

        MFG

        1. problematische Seite

          Hallo pl,

          Ja. Verwende einen Sortier-Callback.

          function sortByFolderAndTitle($a, $b)
          {
             $cmpFolder = ($a['isa'] == 'folder') <=> ($b['isa'] == 'folder')
             if ($cmpFolder == 0)
                $cmpFolder = $a['title'] <=> $b['title'];
          
             return $cmpFolder;
          }
          
          // Oder, nach Anwendung einer Uglifizierung:
          
          function sortByFolderAndTitle($a, $b)
          {
             return ($f=($a['isa']=='folder')<=>($b['isa']=='folder'))!=0?$f:$a['title']<=>$b['title'];
          }
          

          Ach ja. Du verwendest ja ein nicht mehr unterstütztes PHP (alles vor 7.2). Dann musst du den <=> Operator entsprechend ersetzen, z.B. durch eine spaceShip Funktion.

          function spaceShip($a, $b) {
             if (PHP_MAJOR_VERSION > 6) die("Replace me with <=> !");
             return $a<=$b?$a==$b?0:-1:1;
          }
          

          Rolf

          --
          sumpsi - posui - clusi
          1. problematische Seite

            Ok, fertig. Meinen PHP Seiten siehst sieht man nicht an welche Version darunterliegt. Und auch nicht ob die Seite mit Perl oder mit PHP erstellt wurde. Außer dem Hinweis im ersten <p>-Abschnitt.

            MFG

  2. problematische Seite

    Tach!

    Wie sieht denn eine Sortierfunktion aus die nach title sortiert?

    Das PHP-Handbuch listet alle verfügbaren Sortierfunktionen. Die einfachste und gängigste Lösung ist, eine der u*sort-Funktionen mit benutzerdefinierter Vergleichsfunktion zu nehmen. Innerhalb der Funktion vergleichst du den gewünschten Wert der beiden übergebenen Datensätze.

    Für array_multisort() ist die Datenstruktur nicht geeignet, das möchte ein nach Spalten organisiertes Array statt nach Datensatz pro Zeile. Die Daten in der Spaltenform zu organisieren hat meist anderenorts mehr Nachteile als Vorteile hier bei der Sortierung.

    dedlfix.

    1. problematische Seite

      Tach!

      Wie sieht denn eine Sortierfunktion aus die nach title sortiert?

      Das PHP-Handbuch listet alle verfügbaren Sortierfunktionen.

      Hab ich auch gefunden. Da muss man aber auch erstmal selber draufkommn, daß man eine Sortierfunktion mit callback dazu braucht.

      MFG

      1. problematische Seite

        Tach!

        Da muss man aber auch erstmal selber draufkommn, daß man eine Sortierfunktion mit callback dazu braucht.

        Das gibts schon ewig in PHP und ist auch nicht unüblich anderenorts, wo komplexere Strukturen als einfache Arrays mit skalaren Werten verarbeitet werden.

        dedlfix.

  3. problematische Seite

    Hallo pl,

    beginne deine Handbuchlektüre mit usort, wenn Dir die Keys im Array egal sind. Ansonsten mit uasort.

    Für die Callback-Funktion liest Du weiter bei „Callable“. Das kann verschiedenes sein.

    Ein String
    wenn der Callback eine globale function ist
    Ein Array mit zwei Strings
    wenn der Callback statische Methode einer Klasse ist
    Ein Array mit einem Objekt und einem String
    wenn der Callback Instanzmethode eines Objekts ist
    Oder
    Eine anyonyme Funktion (in PHP auch Closure genannt), als Literal oder in einer Variablen.

    Callables haben noch ein paar Spezialvariationen, die kannst Du bei Bedarf nachlesen.

    Der Callback bekommt zwei Parameter $a und $b übergeben, nämlich die zu vergleichenden Array-Elemente.

    Er muss einen negativen Integer, 0 oder einen positiven Integer zurückgeben, je nach dem, ob $a<$b, $a==$b oder $a>$b gilt. Bei Strings kannst Du dafür ab PHP 7 den Spaceship Operator <=> nutzen. Der Betrag des Integers spielt keine Rolle.

    Rolf

    --
    sumpsi - posui - clusi