Einen Heuhaufen in einer Nadel suchen - PHP Haystack in a Needle

Habt ihr das schon mal versucht? Macht eigentlich auch kein Schwein, außer dass Entwicklteam! Wir suchen einen Heuhaufen in einer Nadel! Zugegeben, dass ist sehr schwierig aber wer auf die schlechte Grammatik von PHP stößt und diese ein bisschen versteht, kann diese Aufgabe problemlos lösen.

Wir standen heute vor einer solchen Aufgabe und sind fast ausgeflippt, eh der Mist so funktioniert hat, wie wir uns das vorgestellt haben. Am liebsten hätten wir einen Total-Blackout simmuliert, wären Heim gegangen und hätten unseren Frust bei einer Runde FIFA gegen schwächere Gegner auf der PS3 raus gelassen. Unser halbes Mitglied hatte aber was dagegen. Fuck!

Nun gut! Ihr müsst euch folgendes Vorstellen. Wir haben viele viele viele Rollenketten. Jede dieser Ketten hat eine andere Bezeichnung aber je nach Serie doch etwas gemeinsam. Allein das ist schon richtig Kacke. Nun haben wir aber auch keinen Bock für jede dieser möglichen Typen ein eigenes PHP-Scriptfile zu schreiben. Macht bei dynamischen Webseiten auch keinen Sinn. Nach ein bisschen überlegen sind wir also auf die PHP-Funktion $strpose und $haystack gestoßen. Als Heuhaufen haben wir jetzt unsere Sammlung von vielen Ketten und wollen aber eine bestimmte aus dem Haufen entnehmen, was wir die Nadel nennen.

Auf Deutsch würden wir unsere Frage an den PHP-Core wie folgt stellen: Liebes PHP, befindet sich zufällig die Nadel XY im Heuhaufen? Damit kann PHP aber nichts anfangen. PHP möchte die Frage gerne wie folgt gestellt bekommen: Liebes PHP, in diesem Heuhaufen, kann die Nadel XY dort gefunden werden? PHP ist grammatisch gesehen also sehr eigenartig. Warum das so ist? Beantworten wir nicht, das ist ein langweiliges Thema und geht uns nichts an.


Was wollen wir damit erreichen?

Also, je nachdem welche Rollenkette der Kunde auf unserer Seite betrachten möchte, soll ein Datenblatt generiert werden. Bei den Ketten mit Anbauteilen welche die Zeichen M1x1, M1x2, M2x1, M2x2, K1x1, K1x2, K2x1, K2x2 oder GU enthalten muss eine zusätzliche Tabelle eingeschoben werden, die angibt, auf welches Bauteil sich die nachfolgenden Abmessungen beziehen. Beispiel für die Anbauteile: Winkellasche, Mitnehmerlasche, vulkanisiertes Elastomerprofil oder nichts, also keine zusätzliche Maßtabelle. Die Bezeichnung 08B-1-M1x1 steht zum Beispiel dafür, dass es sich im eine Simplex-Rollenkette nach DIN 8187 mit einer schmalen Mitnehmerlasche auf einer Seite der Kette handelt. 208A-1-K1x1 beschreibt eine Simplex-Rollenkette nach DIN 8188 mit breiten Winkellaschen auf einer Seite der Kette. Und so sieht es dann aus, wenn es mit PHP umgesetzt wird.


Als erstes definieren wir die Funktion

function strposa($haystack, $needles=array(), $offset=0)
{
$stack = array();
foreach($needles as $needle)
    {
    $res = strpos($haystack, $needle, $offset);
    if ($res !== false) $stack[$needle] = $res;
    }
if(empty($stack)) return false;
return min($stack);
}

Erläuterung

$strposa Name der Funktion
   
$haystack Unser Heuhaufen (PHP Standardvariable)
   
$needles Viele Nadeln (unserer Anbauteile) als array (Bereichsvariable)
   
$offset gibt den Startpunkt an, an welcher Stelle nach der Übereinstimmung im Array gesucht werden soll (bei uns von ganz vorne). Wird der gesuchte String gefunden, ermittelt diese Variable an welcher Stelle er gefunden wurde und speichert ihn. $offset kann also keinen negativen Wert erhalten. Der kleinstmögliche ist also 0 (NULL).
   
$foreach Damit überschreiben wir die PHP-Variablenfunktion $needles mit $needle
   
$res Das zwischengespeicherte Ergebnis aus der Funktion
   
If ($res !== false) Hier setzen wir eine Negation ein, welche sagt, wenn das Ergebnis nicht falsch bzw. oder nicht falsch oder wahr ist, soll es in die Variable $Stack abgelegt werden.
   
Ergebnis: Wenn $stack leer ist wird als return Code false ausgegeben anderenfalls soll $stack ausgegeben werden.

Verwenden der Funktion:

$string = $dsatz["kbz2"];
$array = array('-M','-K','-GU');
If (strposa($string, $array, 1))
{
echo "<tr>";
echo "<td id='tablel' colspan='3'>";
    if (strpos(%string, '-M'))
    {
    echo "Abmessungen Mitnehmerlasche";
    }
            elseif (strops($string, "-GU"))
            {
            echo "Abmessungen             Elastomerprofil";
            }
    else
    {
    echo "Abmessungen Winkellasche";
    }
echo "</td>";
echo "</tr>";
}
else
{
echo "";
}

usw….

Die Variable $string wird durch die Variable $dsatz[‘‘kzb2‘‘] definiert dessen Wert aus einer Datenbank herangezogen wird welcher in einer vorangegangen Abfrage ermittelt wurde.


Nachteil unserer Lösung

Diese Lösungsvariante ist etwas schwieriger umzusetzen, benötigt etwas länger Zeit und mehr Hirnschmalz in der Umsetzung, da hierbei die Gefahr von Flüchtigkeitsfehler wesentlich höher ist. Einen Scriptfehler zu entdecken ist daher etwas aufwendiger


Vorteil unserer Lösung

Statt für jede Rollenkettenserie ein extra Scriptfile zur Verfügung zu stellen können wir unser Array beliebig erweitern und müssen nur eine weitere ifelse Anweisung hinzufügen und somit alle im unseren Sortiment angebotenen Ketten mit nur einem Scriptfile abdecken. Das erspart enorm viel Zeit und verringert den Pflegeaufwand von unseren Scriptfiles.


Wie immer darf jeder Ahnunghaber, Lobsager, Guru etc. kommentieren, egal ob Lob oder Tadel, denn uns hält jetzt nichts mehr von FIFA auf der PS3 ab. Wäre es jetzt unfair wenn wir mit FC Barcelona gegen Bradford City spielen? Wir meinen: Nö!


Euer Entwicklteam
 
( 2 Votes ) 

Kommentar schreiben


Sicherheitscode
Aktualisieren