Schleifchen um mein Array

Silke Schümann wrote this 12:08:

So nun ist, denke ich, mein Schleifchen so verstanden, dass ich damit arbeiten kann. Es ist das wohl wichtigste Schleifchen: Das Schleifchen um den Array. Als ich gestern das Skript von DonKult bekam, präsentierte er mir einen andere Syntax für den Array mit meinem Verzeichnisbaum und ich sah zwar, dass da immer noch mein Array war, aber ich wusste nicht mehr, wie ich denn nun das einzelne Element im Array rankommen würde.

  1. $my_array = array(
  2. array('','Startsequenz'),
  3. array('unterordner1/','UnterordnerLink1')
  4. array('unterordner2/','UnterordnerLink2')
  5. array('unterordner3/','UnterordnerLink3')
  6. array('unterordner4/','UnterordnerLink4')
  7. );

Ich kannte von anderen Skripten die folgende Konstellation:

  1. $my_list = 'item1,item2,item3';
  2. $my_array = explode(',',$my_list);

Und hätte dann die Möglichkeit mit $my_array[0] bis $my_array[n] (n geht bis Stückzahl meiner Items) an den Inhalt meines Arrays zu kommen und wenn ich freundlich meinen Array Schachtel, also der Inhalt meines items aus zwei Teilen bestünde (subitem1_teil1|subitem1_teil2), dann hätte ich die Möglichkeit $my_array[n] noch einmal explodieren zu lassen oder zu splitten.

split — Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks in ein Array
array split ( string Suchmuster, string Zeichenkette [, int Beschränkung])

Tipp: Die Funktion preg_split(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu split(). Wenn Sie die Fähigkeiten regulärer Ausdrücke nicht benötigen, ist die Verwendung von explode() schneller, weil diese Funktion nicht unter der Last der Engine für reguläre Ausdrücke steht.

Quelle: web4free PHP Handbuch split

Wobei ich nun gelernt habe, dass wenn man es explodieren lassen kann, dann lässt man es besser explodieren, da es weniger Ressourcen frist. OK. Vielleicht begreife ich dann irgendwann auch, wann split besser ist als explode, aber nicht heute und nicht jetzt.

Bei der Schreibweise von DonKult kann man die Items auch einzeln ansprechen und ich muss es nicht erst explodieren lassen.

  1. echo '<p>var my_menu: '.$my_menu.'<br />';
  2. echo 'var my_menu[0]: '.$my_menu[0].'<br />';
  3. echo 'var my_menu[0][0]: '.$my_menu[0][0].'<br />';
  4. echo 'var my_menu[0][1]: '.$my_menu[0][1].'<br />';
  5. echo 'var my_menu[1][0]: '.$my_menu[1][0].'<br />';
  6. echo 'var my_menu[1][1]: '.$my_menu[1][1].'</p>';

Zeile 1 und 2 gibt erst einmal tump ‘array’ aus *heul*. Nun nur nicht verzweifeln. Die Zeilen 3-6 liefern unsere Daten zurück. Der Die Zeilen 1-6 des Skripts erzeugen eine Ausgabe wie folgt:

var my_menu: array
var my_menu[0]: array
var my_menu[0][0]:
var my_menu[0][1]: Startsequenz
var my_menu[1][0]: unterordner1
var my_menu[1][1]: UnterordnerLink1

Ufffh. Wenn ich also etwas aus diesem Array vergleichen will, um z.B. festzustellen, ob bei welchem Link es sich um gerade aktuellen handelt, dann kann ich das. Wer sich nun wundert, warum hinter var my_menu[0][0]: nichts steht, der schaue noch mal nach oben in unseren Array.

  1. array('','Startsequenz'),

Vor dem Komma steht nichts, denn es ist das Ausgangsverzeichnis und hat somit kein Unterverzeichnis, das man dort eintragen könnte oder sollte. Die Wiedergabe ist also korrekt.

DonKult erinnerte mich gestern auch noch daran, dass ich jeden array mir über print_r($my_array); ausgeben lassen kann. wenn man diese Funktion wie folgt in sein Skript integriert zum nachschauen, dann muss auch nicht im Quelltext nach einer ordentlichen Ausgabe wühlen:

  1. echo '<pre>';
  2. print_r($my_array);
  3. echo '</pre>';

Die Ausgabe sieht dann so aus:

Array
(
    [0] => Array
        (
            [0] =>
            [1] => Startsequenz
        )

    [1] => Array
        (
            [0] => unterordner1/
            [1] => UnterordnerLink1
        )

    [2] => Array
        (
            [0] => unterordner2/
            [1] => UnterordnerLink2
        )

    [3] => Array
        (
            [0] => unterordner3/
            [1] => UnterordnerLink3
        )

    [4] => Array
        (
            [0] => unterordner4/
            [1] => UnterordnerLink4
        )

)

Man beachte: Arrays fangen bei 0 an zu zählen.

Wenn ich das nun in ein Schleifchen packe will, lautet das Script:

  1. $c_my_array = count($my_array);
  2. for($i=0; $i< $c_my_array; $i++){
  3. $my_array[$i][0]=="" ? echo 'Pos '.$i.' ist Root' : echo 'Pos '.$i.' ist nicht Root';
  4. }

Mit dem ersten Wert in der eckigen Klammer, der Variablen $i sorge ich mit for für die Abfrage des äußeren Array und mit der Zahl Null in der zweiten Eckigen Klammer gebe ich an, dass jweils mit dem ersten Wert des inneren Arrays verglichen werden soll, ob dieser Wert leer oder belegt ist. … oder was man sonst so damit anstellen will. :-)

Mehr zum Array findet man in via Google

Und ich kann nun mein Schleifchen um das Thema machen. Array soweit gefressen und begriffen, dass ich den Array nun ohne inneren Aber verwenden kann.


So nun noch eine Kleinigekeiten für alle die mit dem komischen Konstrukt … ? … : …; nichts anfangen können. Das ist die Kurzschreibweise für eine if-Abfrage. Logischer Ausruck ? Wenn True : Wenn False; Für einfach ja/nein_Entscheidungen ist das schneller bequemer und in meinen Augen auch übersichtlicher als if(){…}else{…}

11 Responses to “Schleifchen um mein Array”

  1. creisi Says:

    Na also, und dabei viel und etwas sehr Wichtiges gelernt :-)

  2. DonKult Says:

    Wäre von Nachteil, wenn man bei der Sache nichts lernt. Wenn man das dann auch noch so schön ausarbeitet… wunderbar :)
    Gibt es eigentlich einen Blog der sich mit PHP beschäftigt? Fänd ich gut, wäre ich Stammleser ;) Aber ich glaub ich sollte mir auch mal eine Homepage zulegen, ohne wird man ja heutzutage gar nicht mehr ernst genommen… und dabei ist schon der 2 Blog der mich ausführlichst zitiert: Davon krieg ich immer so rote Bäckchen ;) Aber gut, dass ist eine andere Geschichte. Um etwas beim Schleifebinden behilflich zu sein, geb ich noch ein paar Kommentare zum Thema ab, wenns recht ist (dem Spamfilter ja anscheinend nicht):
    zu split() und explode():
    explode() trennt einen String nach einem feststehenden Zeichen, während split() nach regulären Ausdrücken trennt.
    Ein Beispiel: Ich will $string immer bei einer ‘0′ trennen, dafür verwendet man explode(’0′,$string);
    Anders Beispiel: Ich will $string immer bei ihrgendeiner Zahl (0-9) trennen. Dafür verwende ich split(’[0-9]‘,$string);
    Besser noch verwende ich preg_split(’/[0-9]/’,$string); Diese Funktion hat eine Perl-kompatible Syntax und ist dadurch nebenbei mächtiger und schneller. (ganz nett zum Thema RegEx: http://regexlib.com/ Da erfährt man dann auch, dass man das Beispiel auch mit preg_split(’/\d/’,$string); bewähltigen kann. Wie bereits einmal gesagt, viele Wege führen nach Rom… )
    Zur for-Schleife kann ich sagen, dass es in Verbindung mit Array oft eine Vereinfachung ist die foreach-Schleife zu verwenden, aber dass ist nunwieder Geschmackssache und macht keinen wirklich (gravierenden) Unterschied.
    Zum Trinitätsoperator: (ja, so heisst der in Pseudo-programmier-profi-sprache ;) ) Frau Schümann sagt es ja schon bereits, unglaublich nützlich als Ersatz für einfache If-else-Konstrukte. Großer Vorteil ist, dass so an fast beliebiger Stelle Variabeln auf ihren Wert prüfen und ensprechend reagieren kann, z.B. in Ausgaben oder Parameterübergaben.
    So und abschließend noch etwas zu Quelle web4free.at: Die ist wie viele andere Seiten ein inoffizieller Mirror des eigentlichen PHP.net Manuals, welches in vielen Sprachen existiert und allemal aktueller ist als seine inoffiziellen Spiegel. (http://www.php.net/manual/de/) Riesiger Vorteil ist aber auch, dass man durch Eingabe von php.net/ sofort zur Seite über diese Funktion kommt. Auf dieser kann man auch Kommentare lesen, die Beispiele zur Anwendung geben oder aber man findet sein Problem bereits gelöst in den Kommentaren… Aber auch wenn man nicht genau weiss wie die Funktion heisst kann es sich lohnen PHP.net so aufzurufen. Es wird nämlich versucht zu erraten was gemeint war und wenn nicht fündig wird kann man gleich eine Suche durch die Seite starten. Übrigens: Ein kleines lustiges Feature der Seite ist es auch, dass man sich den Quellcode der aktuell angezeigten Seite anzeigen lassen kann. Das ist also eine rundum schöne Projektseite und nicht nur dazu da sich die aktuelle Version von PHP runterzuladen…
    So, und damit ist dann auch erstmal das ende meiner Ausführungen erreicht und daran merkt man dann auch, dass ich zum bloggen ungeeignet bin, bei der Länge! Das Prinzip von “In der Kürze liegt die Würze” ist mir halt fremd… Naja, vielleicht liest ja einer das Kommentar bis hierhin zuende, dann sei ihm oder ihr gedankt für die Aufmerksamkeit :)
    MfG. David

  3. Silke Schümann Says:

    foreach da ich noch ganz zwischer blinder Nachahmung und Programm verstehen und einsetzen stecke, war mir foreach zu geschlossen. for mit den Variablen erschien mir transparenter, aber ich werde heute abend ganz bewußt noch foreach nehmen, denn es ist kürzer und damit für so einfache Aufgaben bei dem ich nicht zufällig nur jeden zweiten Parameter überprüfen will, so eine Abrage eines rießigen Datenvolumens von Vorne und von Hinten in geraden bis zu Hälfte und umgedreht. Hat mir mal einer meiner EX-Cheffe, seines Zeichens Wirtschaftsinformatiker erklärt … sei effizienter und schneller. Ich habe dieser Methode bei meinem Visitenkarten-Kästle aber nie vertraut und lieber brav von A-Z gesucht. Bei Wahrscheinlichkeitsrechnungen werden die Wahrscheinlichkeiten und der Nutzen dann doch siniger und wahrscheinlich nützlicher als bei so einem kleinen Zettelkasten. Auch dürfte der Nutzen vor allen Dingen dann sich bemerkbar machen, wenn sehr viele Nutzer gleichzeitig auf den Zettelkasten zugreifen.

    Dann bei einer for-Schleife nur jeden zweiten oder Dritten Eintrag von a bis zu Mitte und von Z zur Mitte durchsuchen zu lassen, könnte so manche Suchroutine um ein vielfaches verkürzen und die Zahl derer, die dadurch tatsächlich erst beim allerletzten Suchlauf zum Ergebnis kommen profitieren von der geringeren Serverlast und habe auch zapp schnell ein Ergebnis.

    Wobei ich gerade feststelle, dass ich das erste Mal mir wirklich vorstellen kann, dass diese Suchmethode, die auch einen Namen hat, den ich vegessen habe, zu was gut ist. *kicher*

    Wenn mir PHP.net nicht 4 mal mit Timeout als ich den Artikel schrieb ausgestiegen wäre, stünde da PHP.net. Ich wusste leider wie den Link ohne PHP.net aufzurufen aufbauen, denn gewöhnlich habe ich keine Probleme mit PHP.net.

    web4free.at ist also genau genommen nur ein Notnagel.

    Die Seite beschäftigt sich mit meiner Arbeit und der Arbeit der Co-Autoren, das heißt mit Webdesign, Webmarketing und Web-Programmierung, aktuell in diesem Beitrag mit meinen Spaziergängen in die Programmiersprachen des Internets bzw. genauer in PHP. Sobald ich mich an die Archivseite ranmache, wird es mit dem neuen Tagwarrior auch Feeds zu Tags (Stichworten) geben. Das ist dann schon sehr na am PHP-Blog. Hier ist übrigens ein PHP-Programmierer der bloggt. Das dürfte recht PHP-lastig sein.

  4. creisi Says:

    Ja, das mit for oder foreach oder while oder was auch immer ist so eine Sache. Ich hatte von Anfang an viel mit for gearbeitet, und mich so sehr daran gewöhnt, dass ich, wenn nicht was anderes deutlich geeigneter ist, meistens for verwende. Und dann hatte mal in irgendeinem ziemlich umfangreichen Test for performancemässig sehr gut abgeschnitten, solange man den Counter vor der Schleife festlegt, und das hat mich dann natürlich bestärkt, weiterhin for foreach vorzuziehen, auch wenn foreach eine Vereinfachung wäre. Man gibt halt seine Angewohnheiten nur schwer auf ;-)

  5. Silke Schümann Says:

    Sorry wenn manche Kommentare von Spam-Karma abgefangen werden. Es ist aktuell wohl sehr scharf eingestellt. Ich möchte es dennoch so eingestellt lassen und beeile mich einfach die Kommentare freizuschalten und die Autoren können sich ja selbst freischalten und auch sich ein paar postive Karma-Punkte geben. :D

  6. DonKult Says:

    mmhh. Es ist schon spät, dass könnte erklären wiso ich deinen Post nicht ganz verstehe. Ihrgendwie beschleicht mich daher auch das Gefühl, dass ich doch ihrgendwie in die Schublade “Klugscheißer-vom-Dienst” gerutscht bin. Gefällt mir nicht so recht & war auch gar nicht meine Intension. Um damit mal grundsätzlich aufzuräumen: Wenn ich ihrgendwas kommentiere, dann ist das nicht als negative Kritik zu ihrgendwas zu sehen. Zumeist sind es eigentlich Frage an den Autor oder aber Dinge die mir durch den Kopf gingen, als ich den Artikel & die Kommentare las. Ein Kommentar von mir ist auch nicht grundsätzlich an den Autor gerichtet, sondern zumeistens an den Artikel selbst ~ Klingt komisch, ist aber so ;) z.B. mein Kommentar zu web4free.at & PHP.net: Zugegeben bisweilen etwas missverständlich formuliert (wie der Rest des Kommentares auch wenn ich ihn jetzt nochmal so lese… dafür muss ich mich entschuldigen), war es doch gedacht den Artikel mit meinen Ideen zum Thema etwas anzureichern. Und ich sage bewusst anreichern und nicht überschreiben, den ich denke ein Kommentar ist dazu da an eine Ausgangsidee weitere Ideen anzuheften. Die Hinweise auf PHP.net waren also demzufolge wirklich nur als Hinweise gedacht. Auch nicht unbedingt für den Autor persönlich sondern auch für die (im Optimalfall ) vielen anderen Leser. (Ich persönlich hatte übrigens noch nie Probleme mit der Erreichbarkeit von PHP.net – ich hab anscheind doch mehr Glück als Verstand [und könnte hinzufügen: kein Kunststück] ;) )
    Da mein Kommentar allerdings wie gesagt recht missverständlich war, ignoriere ich (im positiven Sinne) mal alle deine Aussagen die mich wieder zurechtrücken sollen ( Sie sind trotzdem angekommen ) und beziehe mich nur auf deine Idee zur for & foreach:
    Wie gesagt, beide tun bei deiner Problemstellung das selbe. Bei anderen Gegebenheiten klappt das natürlich nicht mehr. Vorallem natürlich bei Algorithmen, wie z.B. dem von dir beschrieben (btw: wird hier im Zusammenhang mit MySQL-Datenbank Indexierung am Beispiel einer Bücherrei erklärt: http://www.rootforum.de/forum/viewtopic.php?p=247850 ). Natürlich machen Algorithem auch erst ab bestimmten Datenmengen wirklich Sinn. wer 100 Zahlen der größe nach sortieren will, der kann das machen wie er will, er wird kaum einen Unterschied feststellen. Anders verhält es sich, wenn er 1 Millionen Zahlen der Größe nach sortieren will. ( Wer sich für Sortierungs- und sonstige Arten von Algorithmen interessiert, der kann z.B. mal auf http://www.algosort.com/ vorbeischauen. ) Das man einige Schleifen ziemlich entschlacken könnte ist wohl war. In der Realität lässt sich ja auch genau das beobachten: Optimieren sollte man immer an seinen Schleifen und Algorithmen, da die einfach das größte Stück des Performancekuchens abbekommen. Ich bin allerdings auch mehr der Meinung, dass man zu Projektbeginn eher erstmal dafür sorgen sollte, dass etwas lauffähiges zu stande kommt und erst später mit den Optimierungen beginnt, da man auch erst dann wirklich abschätzen kann, an welcher Stelle im Code eine Optimierung lohnt und wo nicht, den mit jeder Optimierung wird der Code auch ein Stück undurchsichtiger (sprich: komplizierter) und schluckt Zeit, die man vielleicht auch hätte sinnvoller nutzen können (an anderer Stelle).
    MfG. David

  7. creisi Says:

    David, ich mag Deine Kommentare und fand Deine Ausführungen interessant. Und wegen der Länge: Ist doch OK, v.a. wenn’s dann auch noch so hilfreich und sinnvoll ist. Also ich finde, so ein php-Blog von Dir könnte durchaus lesenswert sein. Ich jedenfalls würde da bestimmt reinschauen.

  8. Silke Schümann Says:

    @DonKult: Habe ich nicht als Klugscheißen empfunden, pardon. Ich war selbst nicht 100% glücklich mit web4free. Ich betrachte Kommentare in Foren und Weblogs zu 99% genauso. Ich vergesse den passiven Leser kaum. Also keine bange. Auch dann wenn ich manchmal so klinge als fühlte ich mich getreten.

    Ich wollte Dich auch nicht wegschicken, mit dem Hinweis zum PHP-Blog. Ich fürchte nur, dass der Anteil der PHP-Beiträge sich eher im Bescheidenen Rahmen hält.

    Die Kommentare sind mehr als willkommen. Der Spam-nachtrag war, weil auch Claudia Reiser in den Spamwolf geraten war.

    ch bin allerdings auch mehr der Meinung, dass man zu Projektbeginn eher erstmal dafür sorgen sollte, dass etwas lauffähiges zu stande kommt und erst später mit den Optimierungen beginnt, da man auch erst dann wirklich abschätzen kann, an welcher Stelle im Code eine Optimierung lohnt und wo nicht, den mit jeder Optimierung wird der Code auch ein Stück undurchsichtiger (sprich: komplizierter) und schluckt Zeit, die man vielleicht auch hätte sinnvoller nutzen können (an anderer Stelle).

    Jein. Ich denke schon, dass man von Anfang an wissen sollte, ob die eingesetzte Methode ein Ressourcenfresser ist oder nicht. Grundsätzlich kann man das von den meisten Methoden sagen. Ich war für 3 Monate angestellt als Jungprogrammiererin und wurde für diverse Routinen schreiben abgestellt. Ich habe wenig bis nichts verstanden und die Skripte gingen zum Kunden, ohne dass mein Kollege mit Ahnung noch einmal drüberschaute. Guess what. Das Projekt was ein Fiasko, wie ich viel später von einer Freundin lernte, die zufällig mit dem Projekt zu tun hatte. Das Projekt hatte massive Performance-Probleme. Ich denke nicht, dass ich die allein hineingebaut habe. Es lag eher daran, dass man um das Projket zu realisieren zu viele von meiner Sorte mit zu wenig KOntrolle das Programm schreiben ließ. Ich habe damals schon heftig den Kopf geschüttelt. Aber ich bin ja dann auch nicht alt geworden in dem Laden. :-)

  9. DonKult Says:

    Wegschicken lass ich mich nicht, wäre ja noch schöner wenn sich der Weblogautor seine Leser aussuchen. :P könnte In die Richtung also keine Angst (oder keine Hoffnung).
    Zum Projektmanagment: Klar, ein bisschen sollte ich beim Programmieren schon denken. Wenn ich weiss, dass mein Script nach riesige Datenmengen verarbeiten muss, dann muss er auch so gestaltet werden, dass er damit umgehen kann. Nur während der Programmierung sollte man nicht alles sofort optimieren. Wenn man sich die Entwicklung von meinetwegen PC Spielen ansieht, so wird mit der Optimierung der Grafikengine auch meist erst begonnen, wenn Sie bereits alle Funktionen enthält, damit andere Teile des Teams bereits drauf aufbauen können. Für sich alleine hat es auch den Vorteil, dass man dann auch gut Analysieren kann, wo es hängt und sich nicht mit Nichtigkeiten die Zeit totschlägt.
    Noch ein wenig ergänzend zu for und foreach:
    Ich hab mal einen kl. Test durchgeführt, der beide Schleifen einen Array mit 1 Millionen Elementen ausgeben lässt. Die foreach-Schleife braucht ca. 8 Sekunden. Die for-Schleife benötigt ca. 6 Sekunden. Macht 2 Sekunden Differenz – bei 1 Millionen Elementen. Bei kleineren Schleifen also vernachlässigbar und dafür verwende ich sie auch normalerweise. Meine Klasse für eine MySQL-Datenbank anbindung liefert mir z.B. einen Array zurück den ich mit foreach durchgehe, ganz einfach deshalb, weil ich mich dann nicht um eine Index-Variable kümmern muss. Der Array erreicht ja auch nie eine sonderlich kritische Größe, aber ich verwende eh massig Zeit damit, dass ich assozierte Arrays verwende, von daher ;) [Dafür hab ich noch keinen Benchmark gemacht, aber das dürfte auf noch kleinere Differenzen hinauslaufen] Genau in diesem Kontext z.B. finde ich es dann herzlich übertrieben wegen Performancegründen die eine Schleife der anderen vorzuziehen. Genauso wie wenn so Spezies auf die Idee kommen, alle Kommentare aus dem Quellcode zu löschen, weil es die Performance herunterzieht. Purer Dummfug… Aber das geht wieder in eine andere Themenrichtung. :)
    @creisi: Na, wenn du meinst. Es ehrt mich. :) Ich kenn auch genug die die Hände über dem Kopf zusammenschlagen wenn sie die vielen Buchstaben in meinen Kommentaren sehen und mich zum Teufel wünschen…

  10. Templaterie Blog Says:

    [...] Als Allererstes sind da die vielen verwirrenden (Syntax-)Zeichen mit seinen unterschiedlichen Bedeutungen und dann kommt schon das Schleifchen um den Array. Es ist eines der wichtigsten Erkenntnisse die ein Anfänger braucht, einmal von der Zeichensetzung abgesehen. [...]

  11. Templaterie Blog Says:

    [...] Ahja. Erkenntnis. Es ist schnurz piep Wurscht ob man das Zählen bei 1 oder bei 9999999999 anfängt. Der Pointer steht am Anfang auf 0 im Array und ich muss wenn ich die Erläuterungen zum File überspringen will, irgendein ftell oder wie auch immer … oder aber die Doku für Faule aus dem Anfang der Datei verbannen und gleich mit den Daten anfangen. PHP lernen ist luschtig! HaHa. Na, ich bin gespannt, wann das Schleifchen um meinen Array wirklich festgezurrt ist und ich keine komischen Überraschungen mehr erlebe. [...]

Leave a Reply