Artikel-Schlagworte: „Code“
‘The Daily Ritual’
<?php /** * 'The Daily Ritual' - A code poem by Sebastiaan de Jonge * * @author Sebastiaan de Jonge * @since 2010.03.01 * @see http://www.identum.at/blog */ // Settings $location = 'Sopron, Home'; // Sleeping $alarm->buzz(); grmbl('..'); flipOver(RIGHT); // If there is time we can sleep a little more $alarm->buzz(); while(time() < (26400 + mktime(0,0,0,date('m'),date('d'),date('Y')))) { grmbl('Five more minutes..'); snooze(); sleep(300); } // Sleeping time is over, time to get up! $alarm->buzz(); turnOffTheAlarm(); echo 'Hello world!'; // Get ready to go to work freshenUp(); dressUp(); echo 'Woohoo!'; // Grab some cookies $cookies = getCookies(); foreach($cookies as $cookie) { eat($cookie); echo '*yumyum*'; // Check if there is time to eat more cookies if(time() (28680 + mktime(0,0,0,date('m'),date('d'),date('Y')))) { run(array('direction' => 'Train')); } } // Get on the train and travel to Vienna getOnTheTrain(); $seated = sitDown(); while($seated) { work(); $location = checkLocation(); if($location == 'Vienna, Wien Meidling') break; } walkToSubway('U6'); // Take the subway $trainIsThere = seeIfSubwayIsThereAlready(array('direction' => 'Florisdorf')); if($trainIsThere) { run(array('direction' => 'Subway')); } else { waitUntilSubwayIsThere(); } getOnSubway(array('direction' => 'Florisdorf')); while($location != 'Vienna, Westbahnhof') { $location = checkLocation(); } getOffSubway(); // Switch at Westbahnhof to the U3, direction Ottakring walkToSubway('U3'); $trainIsThere = seeIfSubwayIsThereAlready(array('direction' => 'Ottakring')); if($trainIsThere) { run(array('direction' => 'Subway')); } else { waitUntilSubwayIsThere(); } getOnSubway(array('direction' => 'Ottakring')); while($location != 'Vienna, Ottakring') { $location = checkLocation(); } getOffSubway(); // Finally, the last walk towards Identum if(itsRaining()) getUmbrella(); while($location != 'Vienna, Sandleitengasse 32') { walk(array('direction' => 'Sandleitengasse 32')); } // Arrived at work! echo 'Woohoo!'; getCoffee('strong'); sitDown(); echo '*Pfew*'; ?>
Blätterfunktion einmal anders
Fast jeder Programmierer hat sie schon einmal geschrieben, die Blätterfunktion. Auch ich bin unlängst wieder über dieses Problem gestolpert und hatte meine übliche Blätterklasse gerade nicht bei der Hand. Ein bisschen Zeit war auch vorhanden, also habe ich mich kurzerhand entschlossen, die Funktion neu zu schreiben.
Mein bisheriger Ansatz unterschied sich nicht wirklich von dem, was einem google so anbietet, wenn man nach einer Blätterfunktion sucht. Mein Problem mit diesen Varianten war jedoch immer, dass der Code durch die doch recht große Anzahl von verschachtelten If-Abfragen, relativ unübersichtlich wird und das wollte ich diesmal vermeiden.
Irgendwann ist mir dann die Idee gekommen einen Zwischenschritt einzulegen. Ich nehme einfach ein leeres Array und setzte nummerische Indizes, wo ich einen Seitenlink angezeigt haben möchte. Also in etwa so:
// $p = aktuelle Seite // $pages = Gesamtanzahl der Seiten // $innerLimit = Anzahl der Seitenlinks die vor und nach der Aktuellen Seite angezeigt werden sollen // also bei $p = 5; $innerLimit = 2; // 3 4 5 6 7 $arrP = array(); for ($i = $p - $innerLimit; $i <= ($p + $innerLimit); $i++) { if ($i >= 1 && $i <= $pages) { $arrP[$i] = true; } }
Möchte ich zusätzlich noch für die ersten und letzten paar Seiten einen Link haben, ergänze ich das Ganze um 2 For-Schleifen:
// $p = aktuelle Seite // $pages = Gesamtanzahl der Seiten // $innerLimit = Anzahl der Seitenlinks die vor und nach der Aktuellen Seite angezeigt werden sollen // also bei $p = 5; $innerLimit = 2; // 3 4 5 6 7 // $outerLimit = Anzahl der Seitenlinks die am Beginn und am Ende immer Angezeigt werden sollen // also bei $pages = 7; $outerLimit = 2; // 1 2 .. 6 7 $arrP = array(); for ($i = 1; $i <= $outerLimit; $i++) $arrP[$i] = true; for ($i = $p - $innerLimit; $i <= ($p + $innerLimit); $i++) { if ($i >= 1 && $i <= $pages) { $arrP[$i] = true; } } for ($i = $pages - $outerLimit + 1; $i <= $pages; $i++) $arrP[$i] = true;
Damit habe ich eine Array das alle anzuzeigenden Seiten als Indizes gesetzt hat und muss mich nicht um mögliche doppelte Einträge kümmern, da der betreffende Index einfach weiterhin gesetzt bleibt. Das Ganze dann einfach per Foreach ausgeben und fertig ist unsere Blätterfunktion. Eventuell möchte man noch die aktuelle Seite abfragen um den Link nicht zu setzen oder zwischen größeren Sprüngen in der Seitenzahl Punkte haben (zB 1 2 .. 5 6), was einfach zu erreichen ist, wenn man den vorherigen Index mitspeichert und vom aktuellen subtrahiert.
Have fun