Rückmeldungen zu meiner Funktion

  • Nabend,


    ich habe eine Funktion gebaut die automatisch Dateien aus einem Ordner ausliest und diese entweder als Liste oder als Liste mit Links ausgibt.


    Die Funktion hat folgende Parameter:


    Pfad:
    Pfad angeben, '.' spricht das gleiche Verzeichnis an, mit ../ ein Verzeichnis zurück.


    Dateinamen:
    Endungen die ausgelesen werden sollen, nur Dateien mit den angegebenen Endungen werden verarbeitet. Durch Komma trennen.


    Attribute:
    Durch Komma getrennt sämtliche Attribute die Links / Listenelemente besitzen sollen, zuerst gibt man die Attribute für die Listenelemente mit, dann durch Komma getrennt die Attribute für die Links. Gibt man nur die Liste aus, aber trotzdem Attribute für die Links mit werden diese ignoriert.


    Ausnahmen:
    Kompletter Dateiname inklusive Endung um die Datei nicht mit einzubeziehen, durch Komma trennen.


    Mode:
    Ist dieser letzte Parameter auf true gesetzt wird das ganze als Liste mit Links ausgegeben, wenn nicht dann nur als Liste : )


    PHP
    <span class="syntaxdefault"><br />  genDataList</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PFAD</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> ENDUNGEN</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> KLASSENNAMEN</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> AUSNAHMEN</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> MENU</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>


    Als Beispiel:


    PHP
    <span class="syntaxdefault"><br />  genDataList</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'inhalt/'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'html,htm,php'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'class="menuListenElement",target="_blank" class="menuLink"'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'guestBookScript.php, anmerkungen.htm'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> true</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>


    Aus dem Ordner Inhalt werden alle .html, .htm und .php Dateien ausgelesen, die Listenelemente bekommen die Attribute class="menuListenElement", die Links bekommen die Attribute target="_blank" class="menuLink". Die Dateien guestBookScript.php und anmerkungen.htm werden nicht ausgelesen da sie evtl. wichtige, nicht für den Benutzer gedachte Daten enthalten.



    Hier der Code:


    PHP
    <span class="syntaxhtml"><br /><span class="syntaxdefault"><?php<br /><br />  </span><span class="syntaxkeyword">function </span><span class="syntaxdefault">genDataList</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$dataTypes</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$attributes </span><span class="syntaxkeyword">= </span><span class="syntaxstring">''</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$exception </span><span class="syntaxkeyword">= </span><span class="syntaxstring">''</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$menu </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">false</span><span class="syntaxkeyword">)<br />  {<br /><br />    if(!</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">) return </span><span class="syntaxdefault">false</span><span class="syntaxkeyword">;<br /><br />    </span><span class="syntaxdefault">$types </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">','</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$dataTypes</span><span class="syntaxkeyword">);<br />    foreach(</span><span class="syntaxdefault">$types </span><span class="syntaxkeyword">as &</span><span class="syntaxdefault">$type</span><span class="syntaxkeyword">)<br />    {<br />      if(</span><span class="syntaxdefault">$type</span><span class="syntaxkeyword">)<br />      {<br />        </span><span class="syntaxdefault">$type </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$type</span><span class="syntaxkeyword">);<br />      }<br />    }<br /><br />    </span><span class="syntaxdefault">$exception </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">','</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$exception</span><span class="syntaxkeyword">);<br /><br />    foreach(</span><span class="syntaxdefault">$exception </span><span class="syntaxkeyword">as &</span><span class="syntaxdefault">$ex</span><span class="syntaxkeyword">)<br />    {<br />      if(</span><span class="syntaxdefault">$ex</span><span class="syntaxkeyword">)<br />      {<br />        </span><span class="syntaxdefault">$ex </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$ex</span><span class="syntaxkeyword">);<br />      }<br /><br />    }<br /><br />    </span><span class="syntaxdefault">$h </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">opendir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">);<br />    if(!</span><span class="syntaxdefault">$h</span><span class="syntaxkeyword">) return </span><span class="syntaxdefault">false</span><span class="syntaxkeyword">;<br /><br />    if(</span><span class="syntaxdefault">$dir </span><span class="syntaxkeyword">== </span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">)<br />    {<br />      unset(</span><span class="syntaxdefault">$dir</span><span class="syntaxkeyword">);<br />    }<br /><br />    while (</span><span class="syntaxdefault">false </span><span class="syntaxkeyword">!== (</span><span class="syntaxdefault">$f </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">readdir</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$h</span><span class="syntaxkeyword">)))<br />    {<br />      </span><span class="syntaxdefault">$d </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$f</span><span class="syntaxkeyword">);<br /><br />      if(</span><span class="syntaxdefault">in_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$d</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$d</span><span class="syntaxkeyword">)-</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">], </span><span class="syntaxdefault">$types</span><span class="syntaxkeyword">) AND !</span><span class="syntaxdefault">in_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$f</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$exception</span><span class="syntaxkeyword">))<br />      {<br />        </span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[] = </span><span class="syntaxdefault">$f</span><span class="syntaxkeyword">;<br />      }<br />    }<br /><br />    if(!</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">)<br />    {<br />      return </span><span class="syntaxdefault">false</span><span class="syntaxkeyword">;<br />    }<br /><br />    </span><span class="syntaxdefault">$return </span><span class="syntaxkeyword">= </span><span class="syntaxstring">''</span><span class="syntaxkeyword">;<br /><br />    switch(</span><span class="syntaxdefault">$menu</span><span class="syntaxkeyword">)<br />    {<br />      case </span><span class="syntaxdefault">false</span><span class="syntaxkeyword">:<br />        </span><span class="syntaxdefault">$attributes </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">','</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$attributes</span><span class="syntaxkeyword">);<br />        foreach(</span><span class="syntaxdefault">$data </span><span class="syntaxkeyword">as &</span><span class="syntaxdefault">$dat</span><span class="syntaxkeyword">)<br />        </span><span class="syntaxdefault">$return </span><span class="syntaxkeyword">.= </span><span class="syntaxstring">'<li '</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$attributes</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]) .</span><span class="syntaxstring">'>'</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">$dat </span><span class="syntaxkeyword">.</span><span class="syntaxstring">'</li>'</span><span class="syntaxkeyword">;<br />      break;<br /><br />      case </span><span class="syntaxdefault">true</span><span class="syntaxkeyword">:<br />        </span><span class="syntaxdefault">$attributes </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">','</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$attributes</span><span class="syntaxkeyword">);<br />        foreach(</span><span class="syntaxdefault">$data </span><span class="syntaxkeyword">as &</span><span class="syntaxdefault">$dat</span><span class="syntaxkeyword">)<br />        {<br />          </span><span class="syntaxdefault">$d </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'.'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$dat</span><span class="syntaxkeyword">);<br />          </span><span class="syntaxdefault">$return </span><span class="syntaxkeyword">.= </span><span class="syntaxstring">'<li '</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$attributes</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]) .</span><span class="syntaxstring">'><a href="'</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">$dir </span><span class="syntaxkeyword">. </span><span class="syntaxdefault">$dat </span><span class="syntaxkeyword">.</span><span class="syntaxstring">'" '</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$attributes</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">1</span><span class="syntaxkeyword">]) .</span><span class="syntaxstring">'>'</span><span class="syntaxkeyword">. </span><span class="syntaxdefault">ucfirst</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$d</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]) .</span><span class="syntaxstring">'</a></li>'</span><span class="syntaxkeyword">;<br />        }<br />      break;<br />    }<br /><br />    return </span><span class="syntaxdefault">$return</span><span class="syntaxkeyword">;<br /><br />  }<br /><br /></span><span class="syntaxdefault">?><br /></span></span>


    (Habe den PHP Code mal etwas vereinfacht für euch)

  • Ähm...


    Wenn du mit foreach trim() anwendest dann wird das nicht auf das eigentliche Array, sondern nur auf eine Kopie angewendet, sprich nachdem die Schleife durchgelaufen ist hat sich am Array nichts geändert, schreibe ich ein & dazu dann ändert dieser trim() Befehl das Array und nicht die Kopie.

  • sry nochmal für totale dummis


    diese foreachschleife ist dafür da, das array, welches den String mit den angegeben Dateiendungen, der an den beistrichen geteilt worden ist, enthält, auszuleses, um den Wert (bereinigt ->trim) der Variable $type zu übergeben ? soweit OK?


    wenn ich drei Dateiendungen angegeben habe ( zB jpg,png,gif) dann habe ich einen Array mit drei Einträgen


    und jetzt


    was steht dann in $type


    ist das bei jedem durchgang etwas anderes?

  • Ich habe ein Array mit den Endungen die vom Verbraucher angegeben wurden, jetzt kann es aber sein das er nicht schreibt "htm,php,html" sondern "htm, php, html" <- mit Leerzeichen.


    Diese 3 Endungen habe ich in einem Array, ich will trim auf alle Elemente anwenden.


    Eine foreach Schleife verwendet aber (egal was sie macht) NICHT das originale Array, sondern nur eine Kopie, sprich wenn ich einfach eine foreach Schleife auf mein Array loslassen würde die trim() auf jedes Element anwenden würde, würde mein Array hinterher genau so aussehen wie vorher, weil foreach lediglich eine Kopie "getrimmt" hat, das & sagt jetzt aber der foreach Schleife sie soll das originala Array und KEINE Kopie nutzen, somit bleibt die trim Funktion auch nach Ablauf der Schleife erhalten.

  • Hmm, mir erschließt sich noch nicht der Sinn dieser Funktion. Sie ist irgendwie als eierlegende Wollmilchsau angelegt. Warum gleich einen fertigen String zurück geben? Was ist, wenn ich genau diese Dateien anders benötige (nicht zur Ausgabe als Liste)?.
    Mein Vorschlag, was Deine Funktion machen könnte:


    • Die Dateien als array zurück geben, wie sie weiter verarbeitet werden ist dann variabel (z. B.als Liste ausgeben).
    • Die Endungen von den Dateien, die ausgelesen werdensollen, als Array übergeben, nicht als String
    • Das Argument Attribute fällt weg
    • Die Ausnahmen als array übergeben nicht als String
    • Außerdem noch alle Unterordner nicht zurück geben (falls bei Deiner Funktion keine Endungen festgelegt werden, gibt sie auch Unterordner aus), dazu mittels is_file prüfen.
    • Als letztes die Sicherheit: Theoretisch könnte man mit der Funktion JEDEN Ordner, auf denPHP Zugriff hat auslesen! Sollte man begrenzen



    Gruß Talwin

  • Zitat von &quot;Talwin&quot;


    Die Dateien als array zurück geben, wie sie weiter verarbeitet werden ist dann variabel (z. B.als Liste ausgeben).


    In diesem Falle Blödsinn, es geht darum in einem CMS eine Navigation auszugeben, und nicht Dateinamen aus Verzeichnissen auszulesen, das wäre ich komplett anders angegangen.


    Zitat von &quot;Talwin&quot;


    Die Endungen von den Dateien, die ausgelesen werdensollen, als Array übergeben, nicht als String


    Wieso als Array übergeben? Finde ich viel komplizierter als sie einfach durch Kommas zu trennen.


    Zitat von &quot;Talwin&quot;


    Das Argument Attribute fällt weg


    Weil?


    Zitat von &quot;Talwin&quot;


    Die Ausnahmen als array übergeben nicht als String


    Ebenfalls finde ich es hier einfacher Kommas zu nutzen, geht sogar schneller.


    Zitat von &quot;Talwin&quot;


    Außerdem noch alle Unterordner nicht zurück geben (falls bei Deiner Funktion keine Endungen festgelegt werden, gibt sie auch Unterordner aus), dazu mittels is_file prüfen.


    Meine Funktion hat den Hintergrund das man Endungen festlegt.


    Zitat von &quot;Talwin&quot;


    Als letztes die Sicherheit: Theoretisch könnte man mit der Funktion JEDEN Ordner, auf denPHP Zugriff hat auslesen! Sollte man begrenzen[/list]


    Das kapier ich nicht, nur derjenige der Zugriff auf den FTP hat kann das alles auslesen, und derjenige könnte es sich also auch gleich runterladen.

  • Zitat von &quot;Basiii&quot;

    In diesem Falle Blödsinn, es geht darum in einem CMS eine Navigation auszugeben, und nicht Dateinamen aus Verzeichnissen auszulesen, das wäre ich komplett anders angegangen.


    Du solltest modular denken, welche Funktionen bzw. Codeteile kann ich in anderen Zusammenhängen wieder verwenden? Daher: Funktionen bzw. Methoden in objektorientierten Umgebungen so allgemein und modular wie möglich halten. Denkbar wäre es, das Ergebnis meiner vorgeschlagenen Funktion (unten mal getFiles genannt) als Argument einer Ausgabefunktion übergeben, daher ist eine Rückgabe als array sinnvoll.

    Code
    genDataList(getFiles());


    Zitat von &quot;Basiii&quot;

    Wieso als Array übergeben? Finde ich viel komplizierter als sie einfach durch Kommas zu trennen.


    Strings musst Du aufwändig zerlegen, arrays nicht. String Operationen sind performant. Außerdem ist das schlechter Stil


    Zitat von &quot;Basiii&quot;

    Weil?


    Weil ja keine Ausgabe in der Funktion stattfindet.


    Zitat von &quot;Basiii&quot;

    Ebenfalls finde ich es hier einfacher Kommas zu nutzen, geht sogar schneller.


    siehe oben


    Zitat von &quot;Basiii&quot;

    Meine Funktion hat den Hintergrund das man Endungen festlegt.


    aha, und wenn das Argument ein leerer String ist? Hast Du das abgesichert?


    Zitat von &quot;Basiii&quot;

    Das kapier ich nicht, nur derjenige der Zugriff auf den FTP hat kann das alles auslesen, und derjenige könnte es sich also auch gleich runterladen.


    nun,man kann Deiner Funktion theoretisch jeden beliebigen Ordner als Argument übergeben ($dir), also werden vielleicht Dateien aus einem Ordner ausgegeben, von dem Du es gar nicht willst. Es ist ja nicht definiert wie und wo diese Funktion aufgerufen wird.

  • Aus dem letzen Zitat + deiner Antwort schließe ich das du überhaupt keine Ahnung hast wie man diese Funktion anwenden soll...


    Tut mir leid aber so sehe ich das.


    Schlechten Stil darfst du es gerne nennen, aber es ist mein Stil, und von der Performance habe ich 0 Unterschied gemerkt, von daher ist es ein in meinen Augen normaler Stil.

  • Zitat von &quot;Basiii&quot;

    Aus dem letzen Zitat + deiner Antwort schließe ich das du überhaupt keine Ahnung hast wie man diese Funktion anwenden soll...


    Tut mir leid aber so sehe ich das.


    Schlechten Stil darfst du es gerne nennen, aber es ist mein Stil, und von der Performance habe ich 0 Unterschied gemerkt, von daher ist es ein in meinen Augen normaler Stil.


    Oh, eine sehr hilfreiche Antwort. Dann erkläre es mir doch bitte, aber bitte nicht so ein Totschlagargument.
    Ein String ist nunmal nicht dazu da um mehrere Argumente zu übergeben, dazu ist ein array semantisch viel sinnvoller.

  • @ Talwin: Mal so blöd gesagt -> Wenn du ein cms schreiben würdest, würdest du den code den du fabrizierst doch auch auf deine bedürfnisse hin "bauen" das du an der gewünschten stelle die gewünschte ausgabe hast. Wenn er ausgaben in einer funktion haben will lass ihn doch.
    Zu Performance ... string operationen sind weniger performant als array operationen ... arrays sind nur speicherintensiver (nimm forach weil es mit der kopie der arrays arbeitet wenn du nicht sagst nim das original ! ) unterschied in der verarbeitungszeit ist daher keiner zu erkennen eher in der speicherbelastung.


    Ich selbst arbeite in einem naja oop mapping stil dh. ich schreibe funktionen die als rückgabewert arrays haben, und ich mus sagen es ist komplizierter als ausgaben in der funtion zu machen.


    Sicher wäre es komfortabler einfach arrays zu übergeben doch wenn du dir seine funktion ansiehst wirst du feststellen das er mit explode aus dem string ein array macht! ... somit ist es doch S++++ß egal was du übergist hauptsache es funktioniert solche haarspaltereien finde ich in diesem falle wirklich kindisch ...

  • Na, dann versuche mal eine wirklich komplexe Anwendung am besten noch mit mehreren Programmierern zu erstellen, da fallen solche "Kleinigkeiten" sehr schnell ins Gewicht. Modular zu programmieren ist sicher nicht komplizierter, es erscheint nur so, wenn man gerade eine Sache haben will. Wenn Du das Gleiche dann aber noch einmal so ähnlich woanders brauchst, dann ärgerst Du Dich, dass Du den Code quasi noch einmal so ähnlich schreiben musst. Und da er erwähnt hat, dass es für ein CMS ist, liegt nahe, dass er das Auslesen eines Ordners mit Sicherheit noch an anderer Stelle brauchen wird, z.B. beim Auslesen von hochgeladenen Dateien etc. Also macht es sehr wohl Sinn Auslesen und Ausgabe zu trennen.

  • -.- fals aber nur fals du es nicht bemerkt hast kann er mit dieser funktion beides !
    Es als navigation (mit links) und als liste ohne links ausgeben dein argument ist schwachsinnig !

  • Zitat von &quot;R4Zz0R&quot;

    -.- fals aber nur fals du es nicht bemerkt hast kann er mit dieser funktion beides !
    Es als navigation (mit links) und als liste ohne links ausgeben dein argument ist schwachsinnig !


    Aha,und wenn er mal beschließt an anderer Stelle Dateien in einer Tabelle auszugeben? Eine neue Funktion?

  • Wozu sollte ich meine Dateinamen öffentlich präsentieren?


    Das ist gleichzusetzen mit deiner Aussage "die Funktion ist unsicher"!


    Bitte unterlasse die Vollzitate, das steht je nach Bildschirm 3-8 Zentimeter über deinem Beitrag.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!