Felix Riesterer: Gelöst! Danke!

Beitrag lesen

Lieber tami,

das hast du ja bestimmt im verlinkten PHP-Man gesehen und hilft dir nicht:

<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');

function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

usort($array, build_sorter('key_b'));

foreach ($array as $item) {
    echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}

  
ich hatte sie schlicht nicht verstanden! Aber nachdem Du Tom hier das mit dem "use()" in "PHP-Closures" [erklärt](https://forum.selfhtml.org/?t=217315&m=1492340) hattest, habe ich es nun geblickt und konnte es erfolgreich einsetzen:  
  
~~~php
        // in einer Methode:  
        uksort($files, $t->sort_dirs_first($files));  
        // ...  
    }  
  
    public  function sort_dirs_first ($files) {  
        return function ($a, $b) use ($files) {  
            if (is_array($files[$a]) && is_string($files[$b])) {  
                return -1;  
            }  
  
            if (is_string($files[$a]) && is_array($files[$b])) {  
                return 1;  
            }  
  
            return strnatcasecmp($a, $b);  
        };  
}

Mit uksort wird wie erwartet ein zu vergleichendes Paar an Schlüsseln an die Callback-Funktion übertragen. Aber da wir die Callback-Funktion nicht (wie schon zu PHP4-Zeiten) als String-Wert ins zweite Argument schreiben, sondern einen Methodenaufruf (siehe "sort_dirs_first"), können wir eine PHP-Closure bauen. Durch den Methodenaufruf übergeben wir einfach das zu sortierende Array, welches dann als eingekapselte Variable (hier kommt dieses "use()" zum Einsatz) unser Array enthält und damit die Werte erreichbar macht (siehe $files[$a] bzw. $files[b]).

Herzlichen Dank!! Ohne diese Diskussion hätte ich die Lösung nicht erkannt, obwohl sie im PHP-Manual ja klar notiert war!

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
0 56

Array sowohl nach Schlüssel als auch nach Wert sortieren

Felix Riesterer
  • php
  1. 0
    tami
    1. 0
      Felix Riesterer
      1. 0
        tami
  2. 0
    tami
    1. 0
      Felix Riesterer
      1. 0
        Tom
        1. 0
          Felix Riesterer
  3. 0
    Tom
    1. 0

      sowohl nach Schlüssel als auch nach Wert sortieren, Nachtrag

      Tom
      1. 0
        Felix Riesterer
        1. 0
          Tom
          1. 0
            Tom
            1. 0

              Denkfehler zurückgenommen

              Tom
  4. 0
    molily
    1. 0
      Felix Riesterer
  5. 1
    tami
    1. 0
      Tom
      1. 0

        Closures in PHP

        tami
        1. 0
          Tom
          1. 0

            Closures in PHP vs. Javascript - warum "use" ? @molily

            tami
            1. 0
              Tom
              1. 0
                tami
          2. 0
            dedlfix
          3. 2
            Sven Rautenberg
          4. 0
            molily
            1. 0

              Closures in PHP - PHP ist eine "Scheißsprache" ... ???

              tami
              1. 0
                molily
                1. 0
                  tami
            2. 0

              PHP ist eine Scheißsprache - PHP sucks - so what ...

              tami
              1. 0
                molily
                1. 0
                  tami
              2. 0
                Tom
                1. 0
                  molily
                  1. 0
                    molily
                  2. 0
                    Felix Riesterer
                    1. 0
                      Tom
                2. 0
                  Felix Riesterer
              3. 0

                PHP ... "while it's not perfect, it works..."

                tami
            3. 0
              Sven Rautenberg
              1. 0
                Felix Riesterer
                1. 0
                  Tom
                  1. 0
                    Tom
                2. 0
                  tami
                  1. 0
                    molily
                    1. 0
                      tami
                      1. 0
                        Tom
                      2. 0
                        molily
                        1. 0
                          tami
                          1. 0
                            molily
                            1. 0
                              Tom
                        2. 0
                          Tom
                          1. 0

                            Changelogs von PHP

                            dedlfix
                            1. 0
                              Tom
        2. 0
          tami
    2. 0

      Gelöst! Danke!

      Felix Riesterer