28.10.2006
Bingo: Zufallsgenerator bei der Arbeit
Seit 13.00 an einem bewölkten Oktober Nachmittag im Jahre 2006 werden den Besuchern der Templaterie in der obersten Zeile je nach Größe des Viewports zwischen 3 und 10 zufällig gewählte Templates als kleine briefmarkengroße Vorschaubildchen präsentiert. Tadaah! Und die Programmierung verlief ganz unerwartet weitgehend frustfrei in einer angemessenen Zeit. Das ist mal ganz was neues für mich. Cool!
Die Zutaten für dieses Script, waren das durch Ingo Turski in meinen Aufmerksamkeitsradar geratene parse_ini_file(), array_rand() und dann noch ein kleines explode().
So eine ini-Datei ist im grundsatz wie folgt aufgebaut:
[ArrayKey_A]
key_A1_subArray = "Wert"
key_A2_subArray = "Wert"
...
[ArrayKey_B]
key_B1_subArray = "Wert"
key_B2_subArray = "Wert"
...
Der Rest war dann die kleine Gehirnakrobatik, bei der ich zwischenrein einen ziemlichen Knoten im Hirn hatte.
Mein ini-file ist wie folgt aufgebaut:
[Seitenname der Zielseite]
Type = "Wert blah ..."
LinkText = "Wert blah ..."
AltText ="Wert blah ..."
BildArray = "bild1, bild2, etc."
[nächster Seitenname der nächsten Zielseite]
Type = "Wert blah ..."
LinkText = "Wert blah ..."
AltText ="Wert blah ..."
BildArray = "bild1, bild2, etc."
Den BildArray hätte man jetzt noch mehr dimensional machen können, aber damit der Alt-Text zum Bild noch individueller zum Bild passt aber das war für meine Problemstellung nicht erforderlich, da ich die Template-Serie betitele und verlinke und nicht das einzelne Bild, das heißt der alt-Text bezieht sich auf die Serie und nicht auf das einzelne Template. Die Schwierigkeit war nun den verschachtelten Array wieder auseinander zu fieseln. Auf Tut.PHP-q.net zum Thema ‘Array’ (Danke an Creisi für die kleine Linkrecherche) lernte ich, dass verschachtelte Arrays über den Key angesprochen werden. Mein Schlüssel zum Problem war eine Liste mit Seitennamen, aus denen zufällig ein bestimmte Anzahl ausgewählt wurde. Ich fing also an mir meinen Array genauer anzusehen und wertete meinen verschachtelten Array und seine Ausgabe mit array-rand() aus. print_r(), array_ keys(), key() halfen mir halbwegs zu verstehen, was abging.
$randThumbs = array_rand($thumbsArr,$tci); gab mir eine Liste der Seitennamen in der Anzahl $tci in einem Array zurück, den ich mit dessen keys [1] bis [$tci] ansprechen konnte und so die Seitennamen zurück bekam. Um also an meine Type, meine LinkText, meinem AltText und meinem BildArray zum Seitennamen zu kommen, musste ich $Name_des_Array[$rand_result[n]]['Key-des-verschachtelten-Arrays'] eingeben. Mit dieser Erkenntnis war es nun nicht mehr schwer:
$tcPhrases = 'fixePhrasen_fixesHTML.ini'$tcThumbs = 'liste_files_and_thumbs.ini'$phrasesArr = (file_exists($tcPhrases)) ? parse_ini_file($tcPhrases, TRUE) : die("Phraselist does not exist.");$thumbsArr = (file_exists($tcThumbs)) ? parse_ini_file($tcThumbs, TRUE) : die("Thumbslist does not exist.");$tci =($phrasesArr['repeatLine']['anz']=="" || $phrasesArr['repeatLine']['anz'] < 2)? '2' : $phrasesArr['repeatLine']['anz'];$randThumbs = array_rand($thumbsArr,$tci);for($tcj=0; $tcj< $tci; $tcj++){$picArr = explode(',',$thumbsArr[$randThumbs[$tcj]]['listPic']);echo "{$phrasesArr['htmlBausteine']['htmlB1']}<a href=\"index.php?c=1&s={$randThumbs[$tcj]}\" {$phrasesArr['linkParam']['aP3']} {$phrasesArr['linkParam']['aP4']}> {$phrasesArr['htmlBausteine']['htmlB2']} <img src=\"pics/{$picArr[array_rand($picArr)]}\" alt=\"{$phrasesArr['theLine']['phrase1']} {$thumbsArr[$randThumbs[$tcj]]['range1']} {$thumbsArr[$randThumbs[$tcj]]['altText']}\" {$phrasesArr['htmlBausteine']['imgP1']} {$phrasesArr['htmlBausteine']['imgP2']} {$phrasesArr['htmlBausteine']['imgP3']} {$slash}> {$phrasesArr['htmlBausteine']['htmlB3']}</a> {$phrasesArr['htmlBausteine']['htmlB4']}<a href=\"index.php?c=1&s={$randThumbs[$tcj]}\" {$phrasesArr['linkParam']['aP3']} {$phrasesArr['linkParam']['aP4']}> {$phrasesArr['theLine']['phrase2']} {$thumbsArr[$randThumbs[$tcj]]['range2']} {$thumbsArr[$randThumbs[$tcj]]['linkText']}</a> {$phrasesArr['htmlBausteine']['htmlB5']}\r\n";}
Was hier wie ein wirrer Wald voller Variablen aussieht, ergibt sich aus der Flexibilität, mit der man später — wenn dann erst einmal das Formular da ist — mit dem man dann im CMS als einfacher Editland-Nutzer seine Zufallsbilder und Texte zusammenstellen wird können und daraus, dass ich nicht eine sondern zwei Typen habe mit der Bezeichnung ‘range1′ und ‘range2′. Das Echo für den Nachbauer an dieser Stelle lautet ungefähr wie folgt:
echo "<p><a href='{$randThumbs[$tcj]}' title='{$thumbsArr[$randThumbs[$tcj]]['linkText']}'><img src='{$picArr[array_rand($picArr)]}' alt='{$thumbsArr[$randThumbs[$tcj]]['altText']}' />
{$thumbsArr[$randThumbs[$tcj]]['linkText']}</a></p> ";
Voila. Wobei ich noch nicht ganz verstehe, warum der Bild-Array per Explode versagt, wenn array-rand(array, 1) lautet, denn auch bei 1 müsste die Ansprache des Verschachtelten Array “BildArray” sich nicht ändern … das Problem löse ich aber auch noch. Vielleicht hat mir ja einer der erfahrenen Programmierer einen Tipp, woran es liegen könnte, dass ich zwei und mehr Zufalls-Ausgaben machen muss.
Wer jetzt wissen will, ob er parse_ini_file() und verschachtelte Arrays richtig verstanden hat, kann ja den Aufbau der fixePhrasen_fixesHTML.ini ausknobeln.
Erstmals Publiziert in Silkester erzählt …
Filed under: Programmierung
2 Comments
February 17th, 2007 at 17:37
[...] PS: Siehe auch Zufallsgenerator bei der Arbeit, was man noch mit so einer Ini-Datei anstellen kann, für die diese nicht gemacht sind. [...]
March 4th, 2007 at 15:24
[...] Als gestern durch eine zu scharf gestellte PHP.ini die Ausgabe des Templaterie-Shop verhindert wurde, ersetzte ich den Programmteil (tc-randomizer in einer Mehrfach-Installation mit diversen Pfadanpassungen) der nach der Servermodernisierung nicht mehr funktionierte durch einen Kommentar “Wegen Wartungsarbeiten deaktiviert.” und ließ mir alles in einem HTML-Kommentar ausgeben, was hier an Variablen und Arrays verwendet wurde. So war der Fehler schnell gefunden und in der Zeit als ich nach der Ursache forschte blieb der funktionierende Teil einschließlich der Darstellung intakt. Wer schaut schon in den Quelltext was hier an Kommentaren zu finden ist. Der Prozentsatz ist verschwindend klein und wenn man den Fehler behoben hat, kann man diese Kommentare wieder herausnehmen … wobei ich glaube, ich habe diese sogar noch drin (jupp, habe ich — ich meine dringelassen aber eingeschlossen in /**/ und damit wird es nicht ausgeliefert. Wer jetzt also im Quelltext nachschlug sah Nüschts dergleichen) … es war dann schon spät und ich war zu müde … Hauptsache es tut. fe7 [...]