Felix Riesterer: Array sowohl nach Schlüssel als auch nach Wert sortieren

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

Liebe Mitlesende,

ich hätte gerne ein Array mittels einer Callback-Funktion sortiert, welche sowohl den Schlüssel, als auch den Wert berücksichtigen soll. Wie kann ich das lösen, denn uasort übergibt an die Callback-Funktion nur die Werte, uksort nur die Schlüssel...

Muss ich mir da etwas völlig eigenes bauen, oder gibt es da schon eine "native" Lösung? Das PHP-Handbuch scheint mir ersteres nahelegen zu wollen.

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  1. hi,

    Liebe Mitlesende,

    ich hätte gerne ein Array mittels einer Callback-Funktion sortiert, welche sowohl den Schlüssel, als auch den Wert berücksichtigen soll. Wie kann ich das lösen, denn uasort übergibt an die Callback-Funktion nur die Werte, uksort nur die Schlüssel...

    Kannst Du mal ein Beispiel machen, wie das ausehen soll?

    $arr["a"] = "abc";
    $arr["b"] = "abc";
    $arr["d"] = "def";

    wie soll beides berücksichtigt werden?

    mfg

    tami

    1. Lieber tami,

      Kannst Du mal ein Beispiel machen, wie das ausehen soll?

      $sort_me = array(  
          'x' => '',  
          'm' => array(),  
          'f' => array(),  
          'g' => ''  
      );  
        
      $sorted = array(  
          'f' => array(),  
          'm' => array(),  
          'g' => '',  
          'x' => ''  
      );
      

      Zuerst soll geprüft werden, ob der Wert ein Array ist, oder nicht. Arrays zuerst.
      Anschließend soll der Schlüssel strnatcasecmp-weise sortiert werden.

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. hi,

        Lieber tami,

        Kannst Du mal ein Beispiel machen, wie das ausehen soll?

        $sort_me = array(

        'x' => '',
            'm' => array(),
            'f' => array(),
            'g' => ''
        );

        $sorted = array(
            'f' => array(),
            'm' => array(),
            'g' => '',
            'x' => ''
        );

        
        >   
        > Zuerst soll geprüft werden, ob der Wert ein Array ist, oder nicht. Arrays zuerst.  
        > Anschließend soll der Schlüssel strnatcasecmp-weise sortiert werden.  
          
        mehr als das fällt mir nicht ein:  
          
        ~~~php
        $sortMe = array(  
            'x' => '',  
            'm' => array(),  
            'f' => array(),  
            'g' => ''  
        );  
          
        foreach ($sortMe as $key => $value)  {  
        	if (is_array($value)) {  
        		$myArrays[$key ]= $value;  
        	} else {  
        		$myStrings[$key] = $value;  
        	}  
        }  
        ksort($myArrays);  
        ksort($myStrings);  
        var_dump(array_merge($myArrays, $myStrings));  
        
        

        das mit der callback-Funktion und usort erschließt sich mir bisher nicht, geschweige denn dass ich eine Vorstellung hätte, wie das hier funktionieren könnte.

        mfg

        tami

  2. hi,

    und, offtopic, schau mal hier: https://forum.selfhtml.org/?t=217166&m=1492071

    mfg

    tami

    1. Lieber tami,

      und, offtopic, schau mal hier: https://forum.selfhtml.org/?t=217166&m=1492071

      danke für den Hinweis! Meine zehn Jahre alten PHP-Scripte waren nicht PHP5.4-fest. Aber jetzt sollte wieder alles tun. Muss mich endlich mal an meine eigene Seite machen...

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Hello leiber Felix,

        und, offtopic, schau mal hier: https://forum.selfhtml.org/?t=217166&m=1492071

        danke für den Hinweis! Meine zehn Jahre alten PHP-Scripte waren nicht PHP5.4-fest. Aber jetzt sollte wieder alles tun. Muss mich endlich mal an meine eigene Seite machen...

        Gästebuch macht immer noch Fehler:

        "Warning: simplexml_load_file(): I/O warning : failed to load external entity "gb ...."

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Lieber Tom,

          Gästebuch macht immer noch Fehler:

          "Warning: simplexml_load_file(): I/O warning : failed to load external entity "gb ...."

          fixed. Danke.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. Hello,

    Muss ich mir da etwas völlig eigenes bauen, oder gibt es da schon eine "native" Lösung? Das PHP-Handbuch scheint mir ersteres nahelegen zu wollen.

    Wenn das Array regelmäßig aufgebaut ist, also ein "Zeilenarray" darstellt:
    Das Array umbauen zum "Spaltenarray"
    Dann eine Spalte mit dem Index ($key.'-'.$value) einfügen und z.B. mit natsort() sortieren.

    http://wiki.selfhtml.org/wiki/Artikel:PHP/Arrays_mal_anders_herum

    Schade, die Funktion zum Umstapeln ist nicht drin...
    Aber ich schreibe nochmal eine.

    Aber so aus dem Bauch raus müsste funktionieren:

    $_spaltenarr = array();

    foreach ($_zeilenarray as $key => $_record)
    {
        insert_record(&$_spaltenarr, $key, $_record, true)
    }

    Und wenn Du nun eine Spalte einfügen willst, machst Du das genauso, wie in einer Datenbank

    foreach($_spaltenarr[$suchspalte] as $key => $value)
    {
        $_spaltenarr['index_1'][$key] = substr('00000' .$key, -5) . ';' . $value;
    }

    natsort($_spaltenarr['index_1']);  ## bei natsort() kann man sich das substr() eigentlich schenken

    und wieder ausgeben:

    foreach($_spaltenarr['index_1'] as $key => $value)
    {
        echo htmlspecialchars(print_r(get_record($_spaltenarr, $key)));
    }

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hello,

      foreach($_spaltenarr[$suchspalte] as $key => $value)
      {
          $_spaltenarr['index_1'][$key] = substr('00000' .$key, -5) . ';' . $value;
      }

      Damit das Sortieren sowohl nach Wert, als auch nach Schlüssel sinnvoll ist, muss der Schlüssel natürlich hinten stehen.

      Derartige Sortierungen werden gerne benutzt, wenn man in sortierten Listen aus Datenbeständen mit Duplicates mit definiertem Aufsetzpunkt blättern will.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. Lieber Tom,

        Derartige Sortierungen werden gerne benutzt, wenn man in sortierten Listen aus Datenbeständen mit Duplicates mit definiertem Aufsetzpunkt blättern will.

        ich möchte nur einen Verzeichnisbaum so sortieren, dass zuerst die Verzeichnisse stehen (Array-Werte) - gefolgt von den Dateien (leere Werte).

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Hello,

          Derartige Sortierungen werden gerne benutzt, wenn man in sortierten Listen aus Datenbeständen mit Duplicates mit definiertem Aufsetzpunkt blättern will.

          ich möchte nur einen Verzeichnisbaum so sortieren, dass zuerst die Verzeichnisse stehen (Array-Werte) - gefolgt von den Dateien (leere Werte).

          Ist das tatsächlich ein Verzeichnis?
          Dann nim  glob() mit "GLOB_ONLYDIR"

          Dann hast Du schon mal die Verzeichnisse sortiert vorliegen

          Dann nimmst Du nochmal glob() und addierst das Ergebnis auf das vorherige auf.
          oder Array_merge(). Die vorhandenen sollten erhalten bleiben und nur die neuen hinten angehängt werden.

            
          <?php   ### glob_sortet.php ### utf-8 ### ÄÖÜäöü  
            
          $_dirs = glob('*', GLOB_ONLYDIR);  
          $_files = glob('*');  
            
          natcasesort($_dirs);  
          natcasesort($_files);  
          $_dirs = array_values($_dirs);  
          $_files = array_values($_files);  
            
          $_files = array_flip($_files);  
          $_dirs = array_flip($_dirs);  
            
          $_all = $_dirs + $_files;  
            
          echo "<pre>\r\n";  
          echo htmlspecialchars(print_r($_all,1)) . "\r\n";  
          echo "<pre>\r\n";  
            
          ?>  
            
          
          

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. Hello,

            <?php   ### glob_sortet.php ### utf-8 ### ÄÖÜäöü

            $_dirs = glob('', GLOB_ONLYDIR);
            $_files = glob('
            ');

            natcasesort($_dirs);
            natcasesort($_files);
            $_dirs = array_values($_dirs);
            $_files = array_values($_files);

            $_files = array_flip($_files);
            $_dirs = array_flip($_dirs);

            $_all = $_dirs + $_files;

            echo "<pre>\r\n";
            echo htmlspecialchars(print_r($_all,1)) . "\r\n";
            echo "<pre>\r\n";

            ?>

              
              
            Da ist noch ein Denkfehler drin.  
            Files dürfen so nicht heißen wie Directories.  
              
            Aber wenn man nicht so bequem ist, wie ich und statt array\_flip() die beiden Arrays mit foreach() wieder zusammenführt, müsste es klappen...  
              
              
              
              
            Liebe Grüße aus dem schönen Oberharz  
              
              
            Tom vom Berg  
            ![](http://selfhtml.bitworks.de/Virencheck.gif)  
              
            
            -- 
             ☻\_  
            /▌  
            / \ Nur selber lernen macht schlau  
            <http://bikers-lodge.com>
            
            1. Hello,

              Da ist noch ein Denkfehler drin.

              War doch keiner.

              Files dürfen so nicht heißen wie Directories.

              Ist durch das Filesystem sowieso sichergestellt.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bikers-lodge.com
  4. Hallo,

    Wenn du bei uksort den Schlüssel hast, kommst du doch einfach an den Wert…?

    Mathias

    1. Lieber molily,

      Wenn du bei uksort den Schlüssel hast, kommst du doch einfach an den Wert…?

      das setzt voraus, dass die Callback-Funktion irgendwie auf das zu sortierende Array zugreifen kann. Das kann sie aber nicht, da ich nicht mit globalen Variablen arbeite und das Array im Kontext einer Funktion als lokale Variable (und nicht als Eigenschaft eines Objektes) auftritt. Die Vergleichsfunktion (Callback) bekommt nur zwei Elemente übermittelt, entweder Werte (uasort), oder Schlüssel (uksort).

      Beispiel:

      class WhatEver {  
        
          public  function cb ($a, $b) {  
              // kein Zugriff auf $sort_me!  
              if (is_string($a) && is_string($b)) {  
                  return strnatcasecmp($a, $b);  
              }  
        
              return 0;  
          }  
        
          public  function hook ($param) {  
              $t = $this;  
        
              $a = $t->do_whatever();  
        
              // more code here  
          }  
        
          private function do_whatever () {  
              $t = $this;  
        
              $sort_me = array(  
                  'x' => '',  
                  'm' => array(),  
                  'f' => array(),  
                  'g' => ''  
              );  
        
              uasort($sort_me, array($t, 'cb')); // cb erhält Schlüssel (Strings)  
              uksort($sort_me, array($t, 'cb')); // cb erhält Werte (Leerstrings und Arrays)  
        
              return $sort_me;  
          }  
      }
      

      Durch den Aufruf von *sort-Funktionen wird das übergebene Array selbst verändert, anstatt es so zu belassen und das sortierte Array als Rückgabewert zu liefern. Ich mag diese Inkonsistenz in PHP nicht besonders, dass es Funktionen gibt, die als Rückgabewert die ausgeführte Operation liefern, während andere nur eine boolsche Rückmeldung über (Miß)Erfolg liefern... Gerade bei den Array-Sortierfunktionen wäre es mir wesentlich lieber gewesen, man hätte das Argument nicht verändert und dafür das Ergebnis als Rückgabewert erhalten. Bei den Stringfunktionen erhalte ich ja auch den veränderten String als Rückgabewert, anstatt dieses komischen Bool-Wertes. o_O

      Liebe Grüße,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  5. hi,

    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";  
    }  
    
    

    mfg

    tami

    1. Hello tami,

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

      kannst Du die Funktion mal erläutern, was die macht?
      Ich kenne das 'use' bisher nur von Namespaces.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. hi,

        Hello tami,

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

        kannst Du die Funktion mal erläutern, was die macht?
        Ich kenne das 'use' bisher nur von Namespaces.

        Ja, das dachte ich auch. Ich kenne das von Javascript ohne use, offenbar braucht die return-Funktion noch einen Hinweis, dass sie mit dem an die erstellende Funktion übergebenen Parameter hantieren soll.

        "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.

        Basically what this means is that you are allowing the anonymous function to "capture" local variables (in this case, $tax and a reference to $total) outside of it scope and preserve their values (or in the case of $total the reference to $total itself) as state within the anonymous function itself."

        http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier

        und dort auch:

        http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier

        mfg

        tami

        1. Hello,

          "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.

          Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

          Oder täusche ich mich da?

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bikers-lodge.com
          1. hi,

            Hello,

            "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.

            Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

            Oder täusche ich mich da?

              
            function bla() {  
            	function blubb() {  
            		echo "piep";  
            	}  
            	blubb();  
            }  
            bla();  
            
            

            piep ;-)

            ???

            Du kannst Dir so wohl gezielt die Variablen aus dem Umfeld in Deine Funktion holen. Mag sein, dass das sogar ein Vorteil ist, mal molily fragen.

            mfg

            tami

            1. Hello,

              function bla() {
              function blubb() {
              echo "piep";
              }
              blubb();
              }
              bla();

              
              > piep ;-)  
              >   
                
              Wenn die function blubb() anderswo schon deklariert wurde, gibt es einen "redefine Error" der eigentlich ja auch "redeclare error" heißen müsste.  
                
              ...  
                
                
              Liebe Grüße aus dem schönen Oberharz  
                
                
              Tom vom Berg  
              ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                
              
              -- 
               ☻\_  
              /▌  
              / \ Nur selber lernen macht schlau  
              <http://bikers-lodge.com>
              
              1. hi,

                Hello,

                function bla() {
                function blubb() {
                echo "piep";
                }
                blubb();
                }
                bla();

                
                > > piep ;-)  
                > >   
                >   
                > Wenn die function blubb() anderswo schon deklariert wurde, gibt es einen "redefine Error" der eigentlich ja auch "redeclare error" heißen müsste.  
                  
                Fatal error: Cannot redeclare blubb()  
                  
                Ist anders als Javascript:  
                  
                ~~~php
                  
                function jupp () {  
                	echo "jupp";  
                }  
                function bla() {  
                	function blubb() {  
                		jupp();  
                		echo "piep";  
                	}  
                	blubb();  
                }  
                bla();  
                
                

                geht. Aber keine Re-Deklaration.
                Wie bei JS:
                <script>

                function test() {  
                	alert("hallo");  
                }  
                function testTest() {  
                	test();  
                	test = function() {  
                		alert("neuesHallo");  
                	}  
                	test();  
                }  
                testTest();  
                
                

                </script>

                mfg

                tami

          2. Tach!

            "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.
            Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

            Oder täusche ich mich da?

            Ja. Das kann man als Ersatz für eine Unterfunktion verwenden, aber das ist nicht dafür gedacht, sondern eher als Ablösung für create_function(), bei dem man den Code als String übergeben muss, der damit für IDEs schlecht lesbar ist und man dann Dinge wie Syntaxhervorhebung und -vervollständigung nicht verwenden kann. Auch Callback, bei denen man den Namen einer anderswo definierten Funktion (oder Methode umständlich als Array) übergeben muss, kann man so gleich an Ort und Stelle definieren. Anonyme Funktionen gab es anderswo schon eher, PHP hat sie mittlerweile nun auch implementiert.

            dedlfix.

          3. Moin!

            "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.

            Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

            Oder täusche ich mich da?

            Mir fehlen die nicht. Ich benutze Objekte, die haben das Feature von privaten Funktionen.

            Wenn dir das nicht zusagt, kannst du alternativ auch Klassen mit statischen (public und private) Funktionen benutzen und denselben Effekt haben.

            Funktionen, die nicht in einer Klasse definiert sind, sind nun mal in einem globalen Scope definiert - da kann es nur eine geben, Mehrfachdefinition ist nicht erlaubt, ebenso ist das Definieren von Funktionen innerhalb von Funktionen zwar möglich, aber nur einmal.

            Das wird in PHP auch nie so geändert werden. Andernfalls würde niemand auf die neue Version updaten, wenn dadurch alter Code unbrauchbar wird.

            Python hat das als schlechtes Beispiel vorgemacht: Die coolen Features sind in Version 3.x drin, die schlechte Welt ist in Version 2.x. Dummerweise sind die coolen Features inkompatibel zu 2.x-Code - wer Code schreiben will, der unter 2.x und 3.x läuft, kriegt weder die coolen Features, noch kann er die alten wichtigen Features benutzen.

            - Sven Rautenberg

          4. Hallo,

            Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

            PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

            Private Funktionen gibt es in prozeduralen, nicht funktionalen Sprachen höchstens in der Objektorientierung (Klassendeklarationen). Closures in PHP sollen weniger das Verschachteln von Funktionen ermöglichen, sondern andere Probleme umgehen:

            • Die Standardbibliothek ist weder konsequent objektorientiert noch funktional, es gibt tausende globale Array-Funktionen anstelle einer Array-Klasse.
                - Bei einer Array-Klasse würde Code üblicherweise im Scope der Instanz ausgeführt, Felix hätte also nicht das Verfügbarkeitsproblem.
                - Bei funktionaler Definition der Sortierfunktion wäre es trivial, die Liste durchzuschleifen. Oder sie wäre über die Scope-Chain verfügbar.
            • Das schreckliche Angeben von Callback-Funktionen über ihren Namen als String. Jetzt sind *einige* Funktionen Objekte, andere müssen weiterhin über ihren Namen als String referenziert werden.
            • Die schlechte Definition der Parameter von Callback-Funktionen. Würden die Callbacks der Sortierfunktionen z.B. die Signatur (a, b, array) haben, hätte Felix das Problem nicht. Closures sind hier eine weitere Lösungsmöglichkeit.
            • Das schreckliche Erzeugen von Funktionen zur Laufzeit über Strings, nur um eine Flexibilität zu erreichen, die Closures und Funktionen als First-Class-Citizen ebenfalls mitbringen.

            Solche Probleme hat man in anderen Sprachen nicht, die Lambdas oder zumindest Blöcke als integrales Sprachfeature haben.

            Mathias

            1. hi,

              Hallo,

              Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

              PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

              Naja, das sagen viele zu Javascript auch und Crockford hat Recht: Du musst die good-parts nehmen. Zusammen mit den bad-parts ist JS "Scheiße".

              Zu Arrays finde ich glaube ich aus der SPL (Standard PHP Library) das ArrayObject (http://www.php.net/manual/de/class.arrayobject.php).

              Private Funktionen gibt es in prozeduralen, nicht funktionalen Sprachen höchstens in der Objektorientierung (Klassendeklarationen). Closures in PHP sollen weniger das Verschachteln von Funktionen ermöglichen, sondern andere Probleme umgehen:

              • Die Standardbibliothek ist weder konsequent objektorientiert noch funktional, es gibt tausende globale Array-Funktionen anstelle einer Array-Klasse.
                  - Bei einer Array-Klasse würde Code üblicherweise im Scope der Instanz ausgeführt, Felix hätte also nicht das Verfügbarkeitsproblem.
                  - Bei funktionaler Definition der Sortierfunktion wäre es trivial, die Liste durchzuschleifen. Oder sie wäre über die Scope-Chain verfügbar.
              • Das schreckliche Angeben von Callback-Funktionen über ihren Namen als String. Jetzt sind *einige* Funktionen Objekte, andere müssen weiterhin über ihren Namen als String referenziert werden.
              • Die schlechte Definition der Parameter von Callback-Funktionen. Würden die Callbacks der Sortierfunktionen z.B. die Signatur (a, b, array) haben, hätte Felix das Problem nicht. Closures sind hier eine weitere Lösungsmöglichkeit.
              • Das schreckliche Erzeugen von Funktionen zur Laufzeit über Strings, nur um eine Flexibilität zu erreichen, die Closures und Funktionen als First-Class-Citizen ebenfalls mitbringen.

              Solche Probleme hat man in anderen Sprachen nicht, die Lambdas oder zumindest Blöcke als integrales Sprachfeature haben.

              s.a.  https://forum.selfhtml.org/?t=217315&m=1492371

              Irgendwie hat Felix das "Problem" doch aber lösen können, und hat sich irgendwie damit auch keinen abgebrochen. Javascript verfügt ja in dem Sinne garnicht über assoziative Arrays, sondern über Objekte. Ich weiß nicht, wie Du da eleganter oder besser ein Objekt
              {"a":[],
              "c" : "",
              "d" : [];
              "f" : ""
              }
              umsortieren würdest, dass erst die Einträge mit den Arrays kommen und dann die mit den Strings ... ???

              mfg

              tami

              1. Irgendwie hat Felix das "Problem" doch aber lösen können, und hat sich irgendwie damit auch keinen abgebrochen.

                Ja, weil du ihm eine funktionale Lösung verraten hast. Du hast eine Higher-Order-Function geschrieben. In PHP! Wenn das nicht »sich einen abbrechen« ist, dann weiß ich nicht, was sonst. ;)

                Javascript verfügt ja in dem Sinne garnicht über assoziative Arrays, sondern über Objekte. Ich weiß nicht, wie Du da eleganter oder besser ein Objekt
                {"a":[],
                "c" : "",
                "d" : [];
                "f" : ""
                }
                umsortieren würdest, dass erst die Einträge mit den Arrays kommen und dann die mit den Strings ... ???

                Objects in JavaScript haben (zumindest der Definition nach) keine Ordnung. Ich würde ein array of objects erstellen und den ganz normal mit einer Sortierfunktion sortieren. Wenn ich einen Hash brauche, um schnell mit einem Key nachschlagen will, dann erzeuge ich aus dem Array einen solchen. Ansonsten iteriere ich einfach über den Array, um ein Element mit dem Datum zu finden.

                Mathias

                1. hi,

                  Irgendwie hat Felix das "Problem" doch aber lösen können, und hat sich irgendwie damit auch keinen abgebrochen.

                  Ja, weil du ihm eine funktionale Lösung verraten hast. Du hast eine Higher-Order-Function geschrieben. In PHP! Wenn das nicht »sich einen abbrechen« ist, dann weiß ich nicht, was sonst. ;)

                  Javascript verfügt ja in dem Sinne garnicht über assoziative Arrays, sondern über Objekte. Ich weiß nicht, wie Du da eleganter oder besser ein Objekt
                  {"a":[],
                  "c" : "",
                  "d" : [];
                  "f" : ""
                  }
                  umsortieren würdest, dass erst die Einträge mit den Arrays kommen und dann die mit den Strings ... ???

                  Objects in JavaScript haben (zumindest der Definition nach) keine Ordnung. Ich würde ein array of objects erstellen und den ganz normal mit einer Sortierfunktion sortieren. Wenn ich einen Hash brauche, um schnell mit einem Key nachschlagen will, dann erzeuge ich aus dem Array einen solchen. Ansonsten iteriere ich einfach über den Array, um ein Element mit dem Datum zu finden.

                  Jo, das hätte Felix in PHP aber auch machen können ;-). Offenbar kenne ich mich mit diesen Dingen wie "gut" und "schlecht" nicht ausreichend genug aus ...;

                  mfg

                  tami

            2. hi,

              Hallo,

              Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

              PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

              "The arguments that PHP is an ugly language are half-truths, PHP only produces ugly code if you suck at coding and don’t care how you go about things, it’s easy to keep PHP code clean if you care."
              ...
              "PHP is one of the most mature web languages around and while it might not enforce strict coding guidelines and set ways of doing things (like function naming and indentation), there are certainly no issues you’ll come across that are the fault of the PHP language itself that will prevent you from deploying something awesome *cough* Facebook *cough* Wikipedia *cough* a lot of Yahoo! projects *cough* WordPress. People who call PHP a bad language are merely wasting their time stating the obvious, many people who use it (like me) acknowledge that it sucks, the ability to mix HTML and PHP alone makes me vomit inside of my head."

              http://ilikekillnerds.com/2012/05/php-sucks-so-what/

              mfg

              tami

              1. Hallo,

                "The arguments that PHP is an ugly language are half-truths, PHP only produces ugly code if you suck at coding and don’t care how you go about things, it’s easy to keep PHP code clean if you care."

                Es gibt durchaus gut und schlecht designte Sprachen. Es gibt expressive, entwicklerfreundliche Sprachen und solche, mit denen sich häufige Aufgaben nur unglaublich umständlich und schwer lesbar lösen lassen. Das alles ist unabhängig von den Fähigkeiten des Entwicklers. Die Kernprobleme von manchen Sprachen lassen sich nicht durch Coding-Guidelines und gute Strukturen umgehen.

                Es gibt ebenso gute und schlechte Sprachfeatures. Z.B. in JavaScript sind diese seit Jahren bekannt und dokumentiert. Man versucht die schlechten zu bekämpfen (z.B. ES5 Strict Mode und Property Descriptors, ES6 Modules, Classes, Arrow Functions, Maps, Block Scope…). In PHP hat man das auch getan (OOP, Namespaces, Traits, Closures, Short Array Syntax…), nur ändert das nichts an dem Grundaufbau, den ich beschrieben habe.

                People who call PHP a bad language are merely wasting their time stating the obvious, many people who use it (like me) acknowledge that it sucks

                Mir scheint es, der Autor will sich vor allem rechtfertigen und Mitleid erheischen… ;)

                Der Artikel versucht letztlich auch gar nicht zu bezweifeln, dass PHP eine schlechte Sprache ist, der Autor will nur rechtfertigen, warum er seine Lebenszeit damit verschwendet, schlechtere Sprachen zu programmieren. </flame> ;)

                Mathias

                1. hi,

                  Hallo,

                  "The arguments that PHP is an ugly language are half-truths, PHP only produces ugly code if you suck at coding and don’t care how you go about things, it’s easy to keep PHP code clean if you care."

                  Es gibt durchaus gut und schlecht designte Sprachen. Es gibt expressive, entwicklerfreundliche Sprachen und solche, mit denen sich häufige Aufgaben nur unglaublich umständlich und schwer lesbar lösen lassen. Das alles ist unabhängig von den Fähigkeiten des Entwicklers. Die Kernprobleme von manchen Sprachen lassen sich nicht durch Coding-Guidelines und gute Strukturen umgehen.

                  Es gibt ebenso gute und schlechte Sprachfeatures. Z.B. in JavaScript sind diese seit Jahren bekannt und dokumentiert. Man versucht die schlechten zu bekämpfen (z.B. ES5 Strict Mode und Property Descriptors, ES6 Modules, Classes, Arrow Functions, Maps, Block Scope…). In PHP hat man das auch getan (OOP, Namespaces, Traits, Closures, Short Array Syntax…), nur ändert das nichts an dem Grundaufbau, den ich beschrieben habe.

                  People who call PHP a bad language are merely wasting their time stating the obvious, many people who use it (like me) acknowledge that it sucks

                  Mir scheint es, der Autor will sich vor allem rechtfertigen und Mitleid erheischen… ;)

                  Der Artikel versucht letztlich auch gar nicht zu bezweifeln, dass PHP eine schlechte Sprache ist, der Autor will nur rechtfertigen, warum er seine Lebenszeit damit verschwendet, schlechtere Sprachen zu programmieren. </flame> ;)

                  Nuja, ich kapiere es scheinbar einfach nicht. Auch nicht, wie sich das Problem von Felix mit JS Objekten hätte einfacher lösen lassen können.

                  https://forum.selfhtml.org/?t=217315&m=1492402.

                  Ich finde PHP einfach und praktikabel besonders natürlich im Zusammenspiel mit HTML.

                  mfg

                  tami

              2. Hello,

                PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

                "The arguments that PHP is an ugly language are half-truths, PHP only produces ugly code if you suck at coding and don’t care how you go about things, it’s easy to keep PHP code clean if you care."

                Es gibt Dinge in PHP, die mit einem Lächeln beim nächsten Update besser sein könnten:

                * $php_errormsg muss global sein, damit man damit sinnvoll arbeiten kann
                * private Funktionen (also solche in Funktionen) sind hilfreich
                * kleine Fehler, wie die Belegung bei $php_errormsg bei Benutzung von flock(LOCK_NB)
                  müssen beseitigt werden
                * Fehlermeldungen (zur Zeit sind sie nur textuell) sollten zumindest mit einer eindeutigen
                  Fehlernummer beginnen, dann könnte man besser auf Fehler reagieren
                * Die Verarbeitung von Post-Parametern zu Arrays sollte konsequent eingehalten werden
                  <input type="image"> liefert nahezu unbrauchbare Variablennamen "feld_x", "feld_y",
                  statt dass "feld[x]=wert" und feld[y]=wert" geliefert werden. Das würde auch
                  "image[1]" als Namen des Elementes möglich machen, das würde dann "image[1][x]" und
                  "image[1][y] liefern, und nicht der y-wert den x-wert überschreiben...
                * fclose() muss wieder auch das Unlocken übernehmen, so wie es jede vernünftige Sprache tut
                  und außerdem das Handle auf false zurücksetzen, sodass man nach einem fclose($fp) nicht mit
                  einem if($fp) auf einen Hammer läuft...

                usw, usw.

                Ich habe in den 16 Jahren, in denen ich PHP benutze zwei Fehler beseitigt bekommen durch die Bengels von PHP, ohne dass sie gemurrt haben. Bei zwei weiteren haben sie mir unverschämte Antworten gschickt, sie aber dann beim überübernächsten Release doch beseitigt.

                Und zwei habe ich noch hängen. Einen (den mit <image> haben sie gerade mal wieder abgelehnt.

                Wünschwenswert wäre außerdem einUnit-Konzept, wie es z.B. Turbo-Pascal hat. Dort kann man Funktionen in einer weiteren Unit überschreiben. Wenn man trotzdem diejenige aus einer anderen geladenen benutzen will, muss man eben einen qualifizierten Bezeichner angeben "system~substr()" wenn ich mir in meiner Unit selber ein "substr()" gebastelt habe (bitte nur als Beispiel".

                PHP ist einfach nicht konsquent!

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bikers-lodge.com
                1. Ich habe in den 16 Jahren, in denen ich PHP benutze zwei Fehler beseitigt bekommen durch die Bengels von PHP, ohne dass sie gemurrt haben. Bei zwei weiteren haben sie mir unverschämte Antworten gschickt, sie aber dann beim überübernächsten Release doch beseitigt.

                  So ist es halt. Die Firma, für die ich arbeite, hat früher hauptsächlich PHP Webanwendungen entwickelt. Als andere leistungsfähigere Sprachen und Webframeworks populär wurden (Django, Rails, selbst Perl machte Fortschritte…), haben wir Bugs gemeldet und an RFCs mitgeschrieben. Die Reaktion war damals ablehnend oder gleichgültig. Ein anderes Beispiel ist das Closures-RFC, das ebenfalls 2007/2008 von Christian Seiler mitentwickelt wurde. Mit PHP 5.3 bzw 5.4 kamen die Features dann mit Jahren Verzögerung, aber da waren viele Leute schon weitergezogen.

                  Mathias

                  1. Ein anderes Beispiel ist das Closures-RFC, das ebenfalls 2007/2008 von Christian Seiler mitentwickelt wurde.

                    Link vergessen
                    https://wiki.php.net/rfc/closures

                  2. Lieber molily,

                    das Closures-RFC, das ebenfalls 2007/2008 von Christian Seiler mitentwickelt wurde.

                    von dem hat man hier nie wieder etwas gesehen... schade! War ein netter Kerl.

                    Liebe Grüße,

                    Felix Riesterer.

                    --
                    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                    1. Hello,

                      Lieber molily,

                      das Closures-RFC, das ebenfalls 2007/2008 von Christian Seiler mitentwickelt wurde.

                      von dem hat man hier nie wieder etwas gesehen... schade! War ein netter Kerl.

                      Seine (eine) Webseite gibt es aber noch:
                      http://christian-seiler.de/projekte/php/bbcode/

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bikers-lodge.com
                2. Lieber Tom,

                  PHP ist einfach nicht konsquent!

                  das ist der *einzige* Vorwurf, den ich der Sprache mache. Andere Vorwürfe vermag ich mangels Sachkenntnis nicht zu machen.

                  Deine type="image"-Sache erinnert mich an das Handling von File-Uploads: $_FILES ist ein superglobales Array, das eine sehr seltsame Indizierung hat. Bei einem Upload mag das ja kein Problem sein, bei mehreren aber schon. Dieser User-Comment fasst das Problem sehr gut zusammen: [Comment]

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
              3. hi,

                hi,

                Hallo,

                Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

                PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

                "The arguments that PHP is an ugly language are half-truths, PHP only produces ugly code if you suck at coding and don’t care how you go about things, it’s easy to keep PHP code clean if you care."
                ...
                "PHP is one of the most mature web languages around and while it might not enforce strict coding guidelines and set ways of doing things (like function naming and indentation), there are certainly no issues you’ll come across that are the fault of the PHP language itself that will prevent you from deploying something awesome *cough* Facebook *cough* Wikipedia *cough* a lot of Yahoo! projects *cough* WordPress. People who call PHP a bad language are merely wasting their time stating the obvious, many people who use it (like me) acknowledge that it sucks, the ability to mix HTML and PHP alone makes me vomit inside of my head."

                http://ilikekillnerds.com/2012/05/php-sucks-so-what/

                "Those 4 reasons are enough for me to keep PHP as my primary language. I do know and actively use Python and server-side JS (Node.JS specifically), as well as a number of other languages. But I stick with PHP for my main projects because, while it's not perfect, it works..."

                http://blog.ircmaxell.com/2012/04/php-sucks-but-i-like-it.html

                mfg

                tami

            3. Moin!

              Hallo,

              Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!

              PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)

              Private Funktionen gibt es in prozeduralen, nicht funktionalen Sprachen höchstens in der Objektorientierung (Klassendeklarationen). Closures in PHP sollen weniger das Verschachteln von Funktionen ermöglichen, sondern andere Probleme umgehen:

              Ich weiß gar nicht, was Christian Seiler sich damals dabei gedacht hat, als er für PHP Closures implementiert hat. Vermutlich hat er es einfach nur getan, weil er es konnte, und das Feature wurde unbeachtet seiner Implikationen, die man erst später herausfinden konnte, reviewed und integriert.

              Insofern sollen Closures in PHP erstmal einfach nur da sein und sonst nix.

              - Sven Rautenberg

              1. Lieber Sven Rautenberg,

                und das Feature wurde unbeachtet seiner Implikationen, die man erst später herausfinden konnte, reviewed und integriert.

                welche Implikationen meinst Du denn?

                Insofern sollen Closures in PHP erstmal einfach nur da sein und sonst nix.

                Hmm. Vielleicht sollte man auch einfach zu serverseitigem JavaScript wechseln. Da hat man Closures wohl von Anfang an gehabt...

                Liebe Grüße,

                Felix Riesterer.

                --
                ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                1. Hello,

                  Hmm. Vielleicht sollte man auch einfach zu serverseitigem JavaScript wechseln. Da hat man Closures wohl von Anfang an gehabt...

                  Mir erschließt sich immer noch nicht, wozu man die nun wirklich benötigt.
                  Wäre deine AUfgabenstellung ohne nicht zu erledigen gewesen?

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bikers-lodge.com
                  1. Hello,

                    Mir erschließt sich immer noch nicht, wozu man die nun wirklich benötigt.
                    Wäre deine AUfgabenstellung ohne nicht zu erledigen gewesen?

                    ich hab's kapiert, was ich damit anstellen kann.

                    Ich kann mir meine geliebten Private Functions damit bauen.

                    Wenn mehrere in einer Master-Function stehen, kennen die sich solange gegenseitig nicht, bis man sie sich (gegenseitig oder wie auch immer) mit use() bekannt macht.

                    Na dann...

                    Ich heb das Bastelbeispiel mal auf, falls es noch jemand sehen will.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bikers-lodge.com
                2. hi,

                  Lieber Sven Rautenberg,

                  und das Feature wurde unbeachtet seiner Implikationen, die man erst später herausfinden konnte, reviewed und integriert.

                  welche Implikationen meinst Du denn?

                  Insofern sollen Closures in PHP erstmal einfach nur da sein und sonst nix.

                  Hmm. Vielleicht sollte man auch einfach zu serverseitigem JavaScript wechseln. Da hat man Closures wohl von Anfang an gehabt...

                  https://forum.selfhtml.org/?t=217315&m=1492470 - der arbeitet mit Node.Js.

                  und https://forum.selfhtml.org/?t=217315&m=1492443 - mit JS kannst Du die Daten so garnicht abbilden, weil es keine assoziativen Arrays gibt ...; und wenn du die Problemstellung auf ein Javascript Objekt (s. Link) überträgst, hängst Du mMn. vor genau dem selben Problem: wie sortieren. Da hilft Dir auch JS nicht weiter, so wie ich das sehe.

                  mfg

                  tami

                  1. Hallo,

                    https://forum.selfhtml.org/?t=217315&m=1492470 - der arbeitet mit Node.Js.

                    Du tust so, als gäbe es einerseits Sprachen, die funktionieren, und andererseits Sprachen, die sich schön programmieren lassen. Ruby-, Python- und Node.js-Anwendungen funktionieren ebenfalls und lassen sich mittlerweile fast genauso einfach deployen, skalieren und warten wie PHP. Nur halt nicht auf jedem 1-Euro-Pro-Monat-Webhoster. Und die Performance reicht für mittelgroße Anwendungen völlig aus.

                    Wenn man ganz große Anwendungen baut, nimmt man aus Performance-Gründen tatsächlich nicht Ruby (MRI), Python (CPython) oder Node.js für Hauptkomponenten, aber sicher auch nicht PHP. Sondern z.B. JVM-Sprachen, Erlang, C++ oder meinetwegen Go.

                    Schau dir Facebook an, die haben aus historischen Gründen eine große PHP-Codebase und müssen Millionen investiert haben, um Hack und die HHVM zu entwickeln, damit sie ihren Legacy-PHP-Code in etwas besseres umwandeln und performant ausführen können.

                    Mathias

                    1. hi,

                      Hallo,

                      http://forum.de.selfhtml.org/my/?t=217315&m=1492470 - der arbeitet mit Node.Js.

                      Du tust so, als gäbe es einerseits Sprachen, die funktionieren, und andererseits Sprachen, die sich schön programmieren lassen.

                      Ich zitiere ...

                      Ruby-, Python- und Node.js-Anwendungen funktionieren ebenfalls und lassen sich mittlerweile fast genauso einfach deployen, skalieren und warten wie PHP. Nur halt nicht auf jedem 1-Euro-Pro-Monat-Webhoster. Und die Performance reicht für mittelgroße Anwendungen völlig aus.

                      Jo, aber was hat das mit "PHP ist Scheiße zu tun"? Klar, ein kleiner Hammer ist Scheiße, wenn man einen Baum fällen will. Er ist auch Scheiße, wenn man eine filigrane Schraube herauspopeln möchte. Eignet sich aber vielleicht für kleine Nägel?

                      Wenn man ganz große Anwendungen baut, nimmt man aus Performance-Gründen tatsächlich nicht Ruby (MRI), Python (CPython) oder Node.js für Hauptkomponenten, aber sicher auch nicht PHP. Sondern z.B. JVM-Sprachen, Erlang, C++ oder meinetwegen Go.

                      Schau dir Facebook an, die haben aus historischen Gründen eine große PHP-Codebase und müssen Millionen investiert haben, um Hack und die HHVM zu entwickeln, damit sie ihren Legacy-PHP-Code in etwas besseres umwandeln und performant ausführen können.

                      Nu ja, was sag ich da: nimm nicht PHP, wenn Du so groß wie Facebook wirst, musst Du von den Milliarden, die Du verdienst, Millionen in die Codeüberarbeitung stecken?

                      Ich dachte, ich hätte in den verlinkten Seiten gelesen, dass auch große Portale mit PHP hantieren? Ich finde übrigens, Deine Ansichten scheinen wesentlich differenzierter, als dass Du hier im Forum propagieren wollen würdest, dass PHP eigentlich garnicht genutzt werden sollte. Ist wohl auch eher müßig darüber zu diskutieren, ob für ein bestimmtes Individuum ein bestimmtes Werkzeug einen Nutzen hat oder haben könnte oder auch nicht. Vielleicht ist es auch einfach die Diskrepanz zwischen Deinen sonstigen Beiträgen und einem simplen "ist Scheiße".

                      mfg

                      tami

                      1. Hello,

                        PHP ist als einfach zu erlendende und anzuwendene Sprache für Webseiten gedacht gewesen und ab PHP 3.x (3.2 ?) auch beutztbar gewesen, ohne ständig auf Hammer zu laufen.

                        Und dann ist es nach und nach überfrachtet worden.

                        Einige Dinge sind besser geworden, andere sind leider "ungewöhnlich" gelöst worden.
                        Es gibt aber keine einheitliche Handschrift hinter den Konzepten.

                        Ich komme einfach nicht drum herum, das immer wieder mit Nikolaus Wirths Pascal und der Weiterentwicklung zu Turbo-Pascal oder zu Modula zu vergleichen. Das waren sichere Sprachen. Da konnte man noch sehen, was man programmiert. C/C++ ist dagegen auch eine Kotzkiste!

                        Und meine Liste aus einem anderen Teil dieses Threads zu PHP-Macken könnte ich bestimmt noch eine Seite lang fortsetzen. Das sind alles keine großen Sachen. Im Gegenteil: es sind die kaputten Kleinigkeiten und die Arroganz der Leute, die auf das Abstellen der Fehler und Designkrücken angesprochen werden und dann nichts tun, weil es sie es nicht für notwendig halten, sich mit Dir auseinanderzusetzen.

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bikers-lodge.com
                      2. Ich finde übrigens, Deine Ansichten scheinen wesentlich differenzierter, als dass Du hier im Forum propagieren wollen würdest, dass PHP eigentlich garnicht genutzt werden sollte.

                        Ich weiß nicht, was du mit diesem Satz sagen willst, er enthält zuviele Konjunktive und Modalverben.

                        Meinst du, ich hätte gesagt, PHP solle nicht genutzt werden? Ich weiß nicht, wo ich das getan haben soll, denn es war nicht Thema der Diskussion. Aber äußern kann ich mich gerne dazu.

                        Ich bin in der Tat der Ansicht, dass Anfänger nicht PHP lernen sollten. Zumindest nicht das PHP, was die meisten Tutorials lehren. Die Probleme, die Low-Level-PHP mit sich bringt, sehen wir hier jeden Tag und wir versuchen sie im Einzelunterricht zu beheben, ohne dass Fortschritte zu sehen sind.

                        Sprachen mit durchdachtem und konsequentem Aufbau sowie funktionalen und objektorientierten Features sind äußerst hilfreich für Lernende. Ich habe selbst PHP als eine der ersten Sprachen gelernt und selbstverständlich alle erdenklichen Fehler gemacht, weil einen nichts davon abhält.

                        Ich plädiere außerdem für ausgereifte Webframeworks mit APIs, die per default sicher sind und saubere Strukturen vorgeben.

                        Ist wohl auch eher müßig darüber zu diskutieren, ob für ein bestimmtes Individuum ein bestimmtes Werkzeug einen Nutzen hat oder haben könnte oder auch nicht.

                        Was ist daran müßig? Solche Diskussionen sind immer wieder hilfreich für Leute, die sich fragen, mit welchen Techniken sie sich beschäftigen sollen und mit welchen Programmiersprachen und Frameworks sie neue Projekte umsetzen sollen.

                        Vielleicht ist es auch einfach die Diskrepanz zwischen Deinen sonstigen Beiträgen und einem simplen "ist Scheiße".

                        Mach mal halblang. Du bist der einzige, der mein ursprüngliches Posting, welches sich zu Designfehlern in PHP und zum Hintergrund von Closures in PHP geäußert hat, auf ein vermeintliches »PHP ist scheiße!« reduziert hast und seitdem Postings produziert, die sich daran aufhängen. Auf den Rest bist du nicht selbst eingegangen, und inhaltlich widersprochen hast du mir auch nicht. Ja, meine Aussage war provokativ, aber auch mit Ironie-Hinweisen versehen und bitte im Kontext zu verstehen.

                        Mathias

                        1. hi,

                          Mach mal halblang. Du bist der einzige, der mein ursprüngliches Posting, welches sich zu Designfehlern in PHP und zum Hintergrund von Closures in PHP geäußert hat, auf ein vermeintliches »PHP ist scheiße!« reduziert hast und seitdem Postings produziert, die sich daran aufhängen.

                          Jo, weil Du nicht der einzige bist, der sowas schreibt, wie meine Netzrecherche ergeben hat.

                          Auf den Rest bist du nicht selbst eingegangen, und inhaltlich widersprochen hast du mir auch nicht. Ja, meine Aussage war provokativ, aber auch mit Ironie-Hinweisen versehen und bitte im Kontext zu verstehen.

                          Mag jeder, wie er will. Ich habe Dich ja sogar gefragt, wie Felix Problem denn anderweitig lösbar gewesen wäre, aber JS kennt ja assioziative Arrays nicht sondern nur Objekte, die ja (angegeblich) keine Reihenfolge haben. Insofern kapiere ich Deine Argumentation nicht. Das Auflisten einiger Mängel - das habe ich ja auch geschrieben - macht aus einer Sprache keine "Scheißsprache". Das kennst Du doch zu genüge von Javascript. Da gibts ganze Vorträge die zum Heulen oder Lachen sind, was für ein Unfug Javascript verzapft in seinen Vergleichen, Objekten (NULL etc.) und ähnlich. Da kann man nur den Kopf schütteln, wenn man nicht weiß, dass JS (wie eigentlich vermutlich alle sprachen) seine good _und_ bad parts hat. Die eigentliche Erkenntnis ist doch, dass jede Sprache (nur) in bestimmten Zusammenhängen ihren Sinn macht.

                          Abgesehen davon weise ich ja immer wieder aufs Zend-Framework hin, was mMn. eine wirklich ordentliche Struktur hat, und es gibt ja noch andere "gute" Frameworks in PHP. Fragt man sich ja, warum sich so viele schlaue Leute so eine Mühe machen, solche ausgefeilten Frameworks (weiter) zu entwickeln, bei einer Sprache, die so ... ach was weiß ich wie sie deiner Meinung nach sein soll, mir ist das Verständnis für Ironie grade abhanden gekommen.

                          mfg

                          tami

                          1. Hallo,

                            Ich habe Dich ja sogar gefragt, wie Felix Problem denn anderweitig lösbar gewesen wäre, aber JS kennt ja assioziative Arrays nicht sondern nur Objekte, die ja (angegeblich) keine Reihenfolge haben. Insofern kapiere ich Deine Argumentation nicht.

                            Ich habe über Closures in PHP geredet, dann kamst du mit JavaScript. JavaScript ist eine andere Geschichte, und ich habe mich nicht umfassend dazu geäußert. Wie auch immer man das Problem in JavaScript nun löst, es ist sehr einfach mit Bordmitteln zu lösen. Ich muss kein Pattern anwenden, das sonst unüblich ist oder aus dem Rahmen fällt. Higher-Order-Functions sind in JavaScript täglich Brot.

                            Das Auflisten einiger Mängel - das habe ich ja auch geschrieben - macht aus einer Sprache keine "Scheißsprache".

                            Es gibt Mängel und es gibt einen grundlegend verwirrenden und beschränkenden Aufbau.

                            Das kennst Du doch zu genüge von Javascript.

                            Nein. JavaScript macht vieles falsch, das wurde übrigens von JavaScript-Anhängern dokumentiert. Aber in seinen Grundlagen sehr viel richtig. Es ist möglich, gute Bücher wie z.B. Eloquent JavaScript als generelle Einführung in die funktionale und objektorientierte Programmierung zu schreiben, weil die Sprache so expressiv ist.

                            Da gibts ganze Vorträge die zum Heulen oder Lachen sind, was für ein Unfug Javascript verzapft in seinen Vergleichen, Objekten (NULL etc.) und ähnlich. Da kann man nur den Kopf schütteln, wenn man nicht weiß, dass JS (wie eigentlich vermutlich alle sprachen) seine good _und_ bad parts hat.

                            Ja, diese rein phänomenologischen Vorträge kann man sich allesamt sparen, denn informativ sind sie nicht. Diese Leute verstehen in der Regel JavaScript nicht, lesen Spezifikationen nicht und erkennen Logiken nicht. Ganz im Gegensatz zur informierten und grundlegenderen Kritik, die z.B. Crockford in »JavaScript – The Good Parts« äußert, die Autoren wie Axel Rauschmayer und Marijn Haverbeke äußern.

                            Die eigentliche Erkenntnis ist doch, dass jede Sprache (nur) in bestimmten Zusammenhängen ihren Sinn macht.

                            Das wäre keine nützliche Erkenntnis. Zu sagen, dass PHP nur in bestimmten Zusammenhängen Sinn macht, ist Quatsch, weil PHP ubiquitär, immer noch erste Wahl für ein Gros der serverseitigen Webprogrammierung ist und die meiste Websoftware PHP erfordert (CMS, Blogsofware, Foren…).

                            Die Erkenntnis sollte sein, eine Programmierumgebung zu wählen, die mehr richtig macht als falsch, die einem Komfort und Sicherheit bietet, die Grundlagen von Variablen, Werten, Objekten, Funktionen, Scopes, Klassen und Namensräumen korrekt hinbekommt sowie Metaprogrammierung und funktionale Programmierung erlaubt.

                            Fragt man sich ja, warum sich so viele schlaue Leute so eine Mühe machen, solche ausgefeilten Frameworks (weiter) zu entwickeln, bei einer Sprache, die so ... ach was weiß ich wie sie deiner Meinung nach sein soll, mir ist das Verständnis für Ironie grade abhanden gekommen.

                            Dass hochintelligente, Informatik-geschulte Menschen mit PHP ein komplexes Framework bauen können, ist nicht die Frage und sagt auch nichts über etwaige Probleme der Sprache aus. Dass große Anwendungen in PHP geschrieben werden und bis zu einem gewissen Punkt funktionieren, steht auch außer Frage. Jetzt lies noch mal, was ich eigentlich geschrieben habe.

                            Grüße
                            Mathias

                            1. Hello,

                              Das wäre keine nützliche Erkenntnis. Zu sagen, dass PHP nur in bestimmten Zusammenhängen Sinn macht, ist Quatsch, weil PHP ubiquitär, immer noch erste Wahl für ein Gros der serverseitigen Webprogrammierung ist und die meiste Websoftware PHP erfordert (CMS, Blogsofware, Foren…).

                              Warum macht man eine Sprache mit Nachdruck ubiquitär und lässt sich dann bei der Behebung der mickrigsten Mängel oder Fehler so ellenlang Zeit? Kann das sein, dass da Andere mitzuentscheiden haben, was geändert werden darf?

                              Ein Schelm, der böses dabei denkt ...

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bikers-lodge.com
                        2. Hello,

                          Ich plädiere außerdem für ausgereifte Webframeworks mit APIs, die per default sicher sind und saubere Strukturen vorgeben.

                          Ack

                          Aber Closures kann ich nun wenigstens zu meinen Zwecken missbrauchen - was so ungefähr den Kern trifft des obigen Satzes, wenn auch von der falschen Seite *g*

                          Man kann es eben einfach machen, also macht man.

                          Da ich fast ein 16 Monate lang so gut wir gar nicht zum Programmieren kam, scheint einiges an Entwicklung in PHP an mir vorbei gegangen zu sein. Gibt es eigentlich eine Seite, in der jeweils Neuerungen vorgestellt und mit Beispielen belegt werden?

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bikers-lodge.com
                          1. Tach!

                            Gibt es eigentlich eine Seite, in der jeweils Neuerungen vorgestellt und mit Beispielen belegt werden?

                            Im Anhang des Manuals sind zu jeder neuen Version die Änderungen aufgeführt: Migrating from ... to ...

                            dedlfix.

                            1. Hello,

                              Tach!

                              Gibt es eigentlich eine Seite, in der jeweils Neuerungen vorgestellt und mit Beispielen belegt werden?

                              Im Anhang des Manuals sind zu jeder neuen Version die Änderungen aufgeführt: Migrating from ... to ...

                              Ich hatte eher an eine Seite gedacht, die das so über die Versionen sortiert komprimiert und vorgekaut präsentiert. Ich habe heute keine Lust, selber zu kauen :-)

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bikers-lodge.com
        2. hi,

          "This is how PHP expresses a closure. This is not evil at all and in fact it is quite powerful and useful.

          Basically what this means is that you are allowing the anonymous function to "capture" local variables (in this case, $tax and a reference to $total) outside of it scope and preserve their values (or in the case of $total the reference to $total itself) as state within the anonymous function itself."

          http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier

          und dort auch:

          http://stackoverflow.com/questions/1065188/in-php-5-3-0-what-is-the-function-use-identifier

          ääh, natürlich http://www.php.net/manual/en/functions.anonymous.php

          mfg

          tami

    2. 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:)