Sabine: SammelThread - PHP-Funktionen

Hallo,

Welche selbst geschriebenen PHP-Funktionen verwendet ihr immer wieder?

Ich fange mal an mit:
weekday_de($ts) - Wandelt einen Timestamp in einen Deutschen Wochentag um:

<?
function weekday_de($ts){
$wochentag[]="Sonntag";
$wochentag[]="Montag";
$wochentag[]="Dienstag";
$wochentag[]="Mittwoch";
$wochentag[]="Donnerstag";
$wochentag[]="Freitag";
$wochentag[]="Samstag";

return $wochentag[date("w", $ts)];
}

Bsp

echo weekday_de(time());
?>

Sabine

  1. Hellihello

    das Ausfiltern von Dateinamen aus einem Ordner. Da habe ich aber verschiedene Versuche irgendwo rumfliegen. Halt nicht glob() sondern mit scandir() und dann die "Folders" (is_dir()) wegschmeissen. Wäre aber vielleicht besser, gleich ein Array mit $res["folder"], $res["files"] zurückzugeben, und bei den Folders die "." und ".." gleich wegzulassen. Hab mich die letzten Tage gefragt, warum es diese Funktion nicht gibt. Auch, wie man seine little-Helpers am besten unterbringt. Vermutlich als statische Funktionen der Klasse "My_Helpers" oder so.

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. Hellihello

      das Ausfiltern von Dateinamen aus einem Ordner. Da habe ich aber verschiedene Versuche irgendwo rumfliegen. Halt nicht glob() sondern mit scandir() und dann die "Folders" (is_dir()) wegschmeissen. Wäre aber vielleicht besser, gleich ein Array mit $res["folder"], $res["files"] zurückzugeben, und bei den Folders die "." und ".." gleich wegzulassen.

      Poste doch mal einen ansatz wir können ja ein bischen zusammen basteln!

      Hab mich die letzten Tage gefragt, warum es diese Funktion nicht gibt. Auch, wie man seine little-Helpers am besten unterbringt. Vermutlich als statische Funktionen der Klasse "My_Helpers" oder so.
      Ja ein paar Funktionen fehlen hier und da, deshalb dieser Thread.

      Also ich habe in jedem Projekt eine func.inc.php die ich mit Include einbinde, aber ich wie bekommt man das hin das genau dieses include überflüssig wird?

      Sabine

      1. Hellihello

          
          
        <?php  
         /**  
         * creates associative multidimensional array -  
         * containing filelist and folderlist of given directory without "." and ".."  
         * @param string  
         * @return array  
         */  
         function get_list_of_files_and_folders($dirname) {  
          //check, if given directory exists  
          if (is_dir($dirname)) {  
           $list_dir = scandir($dirname);  
           $list_of_filenames = array();  
           $list_of_foldernames = array();  
           foreach ($list_dir as $dirname_or_file) {  
            //skip current dir and parent dir  
            if ($dirname_or_file == "." || $dirname_or_file == "..") {  
             continue;  
            }  
            if (is_file($dirname."/".$dirname_or_file)) {  
             $list_of_filenames[] = $dirname_or_file;  
            }  
            elseif (is_dir($dirname."/".$dirname_or_file)) {  
             $list_of_foldernames[] = $dirname_or_file;  
            }  
           }  
           $res["list_of_filenames"] = $list_of_filenames;  
           $res["list_of_foldernames"] = $list_of_foldernames;  
           return $res;  
          } else { //Fehlerbehandlung - keine Ahnung wie  
           return false;  
          }  
         }  
          
        //Test:  
        var_dump(get_list_of_files_and_folders("."));  
          
        ?>  
          
          
          
        
        

        Also ich habe in jedem Projekt eine func.inc.php die ich mit Include einbinde, aber ich wie bekommt man das hin das genau dieses include überflüssig wird?

        Nö, du kannst nur mit auto_append glaub ich was machen, da erhälst du dann aber keine Fehlermeldung. Statt include wäre dann wohl auch eher require_once();

        Dank und Gruß,

        frankx

        --
        tryin to multitain  - Globus = Planet != Welt
        1. Hallo,

          Ist doch ne tolle fertige Funktion..
          kann man schön mit foreach zb weiterbehandeln!

          SAbine

          1. Hellihello

            hier noch etwas unschöneres: gibt direkt einen überblick über alle dateien, die nicht mit einem "." beginnen, inklusive unterordner (also rekursive - ruft sich selbst auf):

              
              
            function overview ($dir) {  
            //  echo "<h3>dir: $dir</h3>\n";  
              foreach(scandir($dir) as $dir_or_file) {  
              if (strpos($dir_or_file,".")!==0) {  
               if (is_dir($dir.'/'.$dir_or_file))  {  
                echo "<li>$dir_or_file<ul>\n";  
                overview($dir.'/'.$dir_or_file);  
                echo "</ul></li>\n";  
               }  
               else {  
                echo "<li>$dir_or_file</li>\n";  
               }  
              }  
             }  
            }  
              
              
            
            

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
  2. Hi,

    rekursives Löschen eines Verzeichnisses:

      
    <?php  
      
    //Verzeichnis mit allen Dateien entfernen (rekursiv)  
    function remove_dir($dir) {  
     if (file_exists($dir)) {  
      $handle = opendir($dir);  
      while ($file = readdir($handle)) {  
       if ($file != "." && $file != "..") {  
        if (is_dir($dir."/".$file)) {  
         remove_dir($dir."/".$file);  
        } else {  
         unlink($dir."/".$file);  
        }  
       }  
      }  
      rmdir($dir);  
      closedir($handle);  
     }  
    }  
      
    ?>  
    
    

    Gruß

    1. Hallo!

      //Verzeichnis mit allen Dateien entfernen (rekursiv)

      Sehr nützlich wenn man mit Putty nicht drauf kommt!

      Super!
      Sabine

  3. Das was ich bisher in php programmiert habe ist so unterschiedlich, daß ich kaum eine Funktion zwei mal verwendet habe.

    Ich schicke aber mal einen "Gegenkandidaten" zu deiner Wochentagfunktion ins Rennen, für die Zeit vor dem timestamp. Kleines Extra, ohne Datum gibt die Funktion den aktuellen Wochentag nach gmdate() zurück.

    function wochentag($datum) { // Datum: TT.MM.JJJJ  
      $wochentage = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");  
      if ($datum == '') {  
        return $wochentage[gmdate("w", (time() + (8 * 3600)))];  
      } else {  
        $d = explode('.',$datum);  
        return $wochentage[jddayofweek(gregoriantojd($d[1], $d[0], $d[2]))];  
      }  
    }
    
    1. return $wochentage[gmdate("w", (time() + (8 * 3600)))];

      *hüstel* Die Zeile nach Bedarf ändern.

    2. Hallo,

      warum so kompliziert? Mit strftime kann man ganz bequem das Datum formatieren, auch auf deutsch:

      setlocale(LC_ALL, array('de','de_DE@euro','deu'));  
      echo strftime("%A, %d. %B %Y, %H:%M Uhr");
      

      Alex

      1. Hallo

        setlocale(LC_ALL, array('de','de_DE@euro','deu'));

        echo strftime("%A, %d. %B %Y, %H:%M Uhr");

        Okay wieder was gelernt!  
          
        Sabine
        
        1. Hallo,

          setlocale(LC_ALL, array('de','de_DE@euro','deu'));

          echo strftime("%A, %d. %B %Y, %H:%M Uhr");

          
          > Okay wieder was gelernt!  
            
          das funktioniert allerdings nur, wenn der Server auch die korrekten Locales installiert hat – und um den Zeichensatz hat sich dann auch noch keiner gekümmert (was z.B. bei „März“ in Deutsch schon ganz schön schnell zu einem Problem werden kann).  
          Ich mach das mittlerweile nicht mehr mit Locales sondern (leider) wieder von Hand.  
            
          Viele Grüße,  
          Gero
          
          1. Dann jag das doch eifnach nochmal durch utf8_encode:
            setlocale(LC_ALL, array('de','de_DE@euro','deu'));
            $result = utf8_encode(strftime("%A, %d. %B %Y, %H:%M Uhr));

            Aber scheinbar hat mein Server auch kein "Deutsch drauf". hmmm
            Muss man dann eben Projekt für Projekt, Server für Server individuell gestalten.

            Sabine

            1. Hallo Sabine,

              Dann jag das doch eifnach nochmal durch utf8_encode:
              setlocale(LC_ALL, array('de','de_DE@euro','deu'));
              $result = utf8_encode(strftime("%A, %d. %B %Y, %H:%M Uhr));

              das bringt leider nichts, weil je nach Ausführung der Locale auch Strings zurückgegeben werden können, die nicht in ISO-8859-1 kodiert sind – woraufhin mir utf8_encode() alles kaputt machen würde. Ich kenne leider keine Möglichkeit, den Zeichensatz der verwendeten Locale sicher herauszufinden.
              Das Setzen der Locales inklusive der Zeichensatzangabe klingt zwar wie eine gute Idee, geht aber spätestens auf Windows schief (weil es da keine Angabe des Zeichensatzes gibt – oder liege ich da falsch?).
              Wie gesagt, ich bin wieder dabei angekommen, die lokalisierten Strings von Hand in meinen Code zu schreiben...

              Muss man dann eben Projekt für Projekt, Server für Server individuell gestalten.

              ... eben, weil ich darauf keine Lust mehr habe. Wenn ich mir einen Satz von Funktionen zurechtbastele, dann möchte ich, dass sie so immer wie möglich funktionieren und ich mich nicht bei jedem neuen Projekt, bei jedem Serverumzug, bei jedem Upgrade wieder mit selbstgebastelten Problemen herumschlagen muss.

              Viele Grüße,
              Gero

              1. OK..
                Wie sieht denn deine Lösung dafür aus??

                Ich grübel jetzt schon wieder gut 1-2 Stunden an der perfekten Lösung für jedermann.

                Ich hätte gerne eine "German-Date"-Funktion der ich wie bei der bekannten date()-Funktion Schlüsselparameter übergeben kann um so mein gewünschtes Format zu erhalten. Dabei soll es aber egal sein ob das eine TimeStamp ist oder das DEUTSCHE Datumsformat TT.MM.JJ(JJ).

                Beispiel:

                date_de("D", "18.06.08");
                // Soll anzeigen: MI

                date_de("l", "18.06.08");
                // Soll anzeigen: Mittwoch

                date_de("F", "18.06.08");
                // Soll anzeigen: Juni

                date_de("l mitten im F", "18.06.08");
                // Soll anzeigen: Mittwoch mitten im Juni

                date_de("d.m.y", time());
                // Soll anzeigen: 18.06.08

                date_de("l mitten im F", time());
                // Soll anzeigen: Mittwoch mitten im Juni

                Das wäre doch ne Tolle Funktion. Doch leider bekomme ich es nicht hin. Ich dachte da natürlich gleich an str_replace - doch nach folgender überlegung scheiterte auch das:

                str_replace("Sun", "SO", "Sunday");
                // SOday

                Gibt es eine Möglichkeit nur "Sun" durch "SO" zu ersetzen und "Sunday" durch "Sonntag" usw.. ohne das sich beide Suchmuster gegenseitig behindern?

                Sabine

                1. Hallo Sabine,

                  Wie sieht denn deine Lösung dafür aus??

                  Gar nicht so unterschiedlich zu Deiner zuerst geposteten Version. Ich habe die Tage (und Monate) halt in mehreren Sprachen und in mehreren Zeichensätzen.

                  Ich hätte gerne eine "German-Date"-Funktion der ich wie bei der bekannten date()-Funktion Schlüsselparameter übergeben kann um so mein gewünschtes Format zu erhalten. Dabei soll es aber egal sein ob das eine TimeStamp ist oder das DEUTSCHE Datumsformat TT.MM.JJ(JJ).

                  date_de("l mitten im F", "18.06.08");
                  // Soll anzeigen: Mittwoch mitten im Juni

                  Ich bin ja laufend nur am meckern, aber ich glaube nicht, dass das eine gute Idee ist. Beim ersten Parameter hast Du nicht nur programmiertechnisch  das Problem mit str_replace() – vielmehr ist das ein logisches Problem. Es gibt keine Chance, weder für das Programm, noch für den Programmierer, zu wissen, ob das Zeichen als literales Zeichen oder als aufzulösender Platzhalter interpretiert werden soll. Deswegen verwendet strftime() (http://php.net/manual/en/function.strftime.php) zum Auszeichnen der Platzhalter das Prozentzeichen.
                  Ausserdem halte ich auch die Idee mit dem deutschen Datumsformat für mittelmäßig – ich würde alles so schnell es geht in einen Timestamp umwandeln. Auf gar keinen Fall würde ich anfangen, mit Stringrepräsentationen von Daten zu „rechnen“.
                  Für die Lesbarkeit im Code kannst Du Dir ja eine date_de2timestamp()-Funktion machen – wobei ich ja finde, dass das deutsche Datumsformat ganz schön unsinnig ist. YYYY-MM-DD finde ich viel schlauer (erst die grobe Einteilung, dann die feinere)

                  Viele Grüße,
                  Gero

                  1. Moin,

                    Es gibt keine Chance, weder für das Programm, noch für den Programmierer, zu wissen, ob das Zeichen als literales Zeichen oder als aufzulösender Platzhalter interpretiert werden soll.

                    Ja lass mal überlegen.
                    Was soll denn überhaupt ersetzt werden??

                    • JAN-DEC => JAN-DEZ
                    • JANUARY-DECEMBER => JANUAR-DEZEMBER
                    • Mon-Sun => MO-SO
                    • Monday-Sunday => Montag bis Sonntag (Ja ich weiss fängt bei Sonntag an)

                    Ja und der rest kann ja so bleiben wie er ist - Universell, oder? Kalender-Wochen zb sind doch überall gleich, oder?.

                    Ausserdem halte ich auch die Idee mit dem deutschen Datumsformat für mittelmäßig – ich würde alles so schnell es geht in einen Timestamp umwandeln.
                    YYYY-MM-DD finde ich viel schlauer (erst die grobe Einteilung, dann die feinere)

                    Das ist aus logischer-Sicht natürlich richtig, aber aus "Menschlicher"-Sicht ist es andersrum besser! Welcher Tag heute ist, ist das wichtigste.. Den Monat kann man sich auch merken, daher nicht so wichtig und das Jahr sowieso - deshalb an letzter Stelle.
                    Aber bei der Buchhaltung, Programierung, etc ist das Englische?-Format besser!

                    Sabine

                    1. Hallo.

                      Ja und der rest kann ja so bleiben wie er ist - Universell, oder? Kalender-Wochen zb sind doch überall gleich, oder?.

                      Selbst auf die Gefahr hin, mich zu wiederholen: Nachschlagen!
                      MfG, at

                      1. Hallo.

                        Kalender-Wochen zb sind doch überall gleich, oder?.
                        Nachschlagen!

                        Gut das ich das jetzt auch mal weis :-/

                        Sabine

                    2. Aber bei der Buchhaltung, Programierung, etc ist das Englische?-Format besser!

                      Wieso? Ist doch nur ein Mischmasch, der die genannten Nachteile vereint, außer man läßt die Jahreszahl weg.

                  2. Ausserdem halte ich auch die Idee mit dem deutschen Datumsformat für mittelmäßig – ich würde alles so schnell es geht in einen Timestamp umwandeln.

                    "So schnell wie möglich" wäre "für die Zeit vor dem timestamp" dann nie?!

  4. Moin.

    dump_files.php
    get_files_by_ext.php
    filter_by_keys.php

    Die habe ich mir mal gebaut, um sowas machen zu können:

      
    dump_files(filter_by_keys(get_files_by_ext('js', $dir), explode(',', $_SERVER['QUERY_STRING'])), "\n\n");  
    
    

    Christoph

    1. Guden,

      dump_files(filter_by_keys(get_files_by_ext('js', $dir), explode(',', $_SERVER['QUERY_STRING'])), "\n\n");

      Eine kleine Beschreibung wäre nett.  
        
      Sabine  
      
      
      1. Moin.

        Die Namen der Funktionen sind doch eigentlich selbsterklärend:

        dump_files($files, $glue = '', $flush = false)
        Gibt die Dateien $files hintereinander und mit $glue getrennt aus. Falls $flush, wird zwischendurch stets ob_flush() ausgeführt.

        filter_by_keys($src, $keys)
        Liefert ein neues Array, dass alle Einträge aus $src mit Schlüsseln in $keys enthält.

        get_files_by_ext($ext, $dir = '.')
        Liefert alle Dateien in $dir, die auf ".$ext" enden in einem assoziativen Array $dateinama_ohne_endung => $dateiname.

        Ansonsten hab ich da auch mal was vorbereitet.

        Christoph

        1. Hallo Christoph,

          Die Namen der Funktionen sind doch eigentlich selbsterklärend:

          Weder die Namen, noch der Code selbst, da erliegt der Programmierer einer verbreiteten Illusion. Ich wiederhole mich gerne:

          "Unkommentierter Code ist miserabler Code."

          Freundliche Grüße

          Vinzenz

          1. Moin.

            "Unkommentierter Code ist miserabler Code."

            Grundsätzlich richtig, ja. Allerdings bedeuten Kommentare ein mehr an Arbeit beim Schreiben des Codes (sparen dafür aber Zeit beim Wiederverwenden) und müssen außerdem stets aktuell gehalten werden. Falsche Kommentare sind schädlicher als gar keine Kommentare, wohingegen der Code selbst stets aktuell ist. Trotzdem habe ich deine Hinweise natürlich berücksichtigt und jetzt alles hübsch kommentiert, auch wenn bei der Kürze der Funktionen das Lesen der Kommentare fast genauso lang dauert wie das Lesen des Codes ;)

            Christoph

  5. (Hallo|Hi(ho)|Tag) Sabine,

    Hallo,

    Welche selbst geschriebenen PHP-Funktionen verwendet ihr immer wieder?

    Ich fange mal an mit:
    weekday_de($ts) - Wandelt einen Timestamp in einen Deutschen Wochentag um:

    <?
    function weekday_de($ts){
    $wochentag[]="Sonntag";
    $wochentag[]="Montag";
    $wochentag[]="Dienstag";
    $wochentag[]="Mittwoch";
    $wochentag[]="Donnerstag";
    $wochentag[]="Freitag";
    $wochentag[]="Samstag";

    return $wochentag[date("w", $ts)];
    }

    ... und wenns mal nicht in Deutsch sein soll:

      
    // ...  
    define('FOXY_CLDR_SHORT_NAME', 1);  
    // ...  
      
      /// returns name of weekday[1] according to your system's locale settings  
      function wkday_name(  
        $wkday = NULL,  
        $options = NULL  
      ) {  
        if (!is_int($wkday)) {  
          return FALSE;  
        }  
        $wkday %= 7;  
        if ($wkday < 0) {  
          $wkday += 7;  
        }  
        return strftime(  
            (FOXY_CLDR_SHORT_NAME === $options) ? '%a' : '%A',  
            ($wkday + 3) * 86400  
        );  
      }  
      
    //[1] day of the week ;-)  
    
    

    MffG
    EisFuX