Hallo,
die folgende Funktion soll aus einer Zeichenkette mit einem vorgeschriebenem Format ein Array machen mit 26 Zahlen die
für alle Buchstaben stehen also Array[0] für A und der Inhalt
beschreibt wie oft A in der Zeichenkette $sig2 vorkommt.
$letter und $letter2 geben die Buchstabengrenzen an zwischen denen
nach der Anzahl in $sig2 gesucht wird.
Das Format von $sig2 ist denkbar einfach, die Buchstaben sind der
Reihenfolge nach sortiert. BAC wäre also nicht möglich AHZ schon.
Soll ein Buchstabe öfter vorkommen so folgt ihm die Anzahl z.B.
A8H2IQ A kommt 8 mal vor H 2 mal und I und Q je 1 mal.
Nehmen wir nun diesen String als Ausgang so übergeben wir:
build_ltrarray(0,1,"A8H2IQ");
0 steht für A und 1 für B also beginnt die Suche nach den Buchstaben bei
A und der nächste Buchstabe der in $sig2 vorkommt ist B.
Die Funktion arbeitet zunächst ohne Probleme bis wir an das Ende des Strings
gelangen.
Denn der letzte Aufruf dürfte in etwa so aussehen:
build_ltrarray(ord("Q"),ord("R")+1,"Q");
Nur folgende Zeile if ($pos_ltr_now === false) ergibt false = false, weil
$pos_ltr_now für die Position von Q in "Q" steht welche 0 ist.
Dies wird von PHP so interpretiert als ob 0 Boolean wäre und somit false.
Also wird der nächste Buchstabe gebildet also geht es weiter im Ascii-Code R,S,T,[...] und das ganze hängt sich auf.
Die Funktion ist evtl. etwas kompliziert wenn jemand eine Lösung kennt oder schon einmal Vereinfachungen kennt immer raus damit ;).
function build_ltrarray($letter,$letter2,$sig2)
//Zerlegt eine Signatur2 in ein Buchstaben Array
{
//Falls nicht vorhanden Array kreiren
if (!isset($barray))
{
$barray = array();
for ($i = 0; $i < 26;$i++)
array_push($barray,0);
}
$pos_ltr_now = strpos($sig2,$letter+65);
$pos_ltr_nxt = strpos($sig2,$letter2+65);
if (strlen($sig2) > 1 or chr($letter+65) <> $sig2)
{
//Wenn aktueller Buchstabe nicht in Signatur rekursiver neu Aufruf
if ($pos_ltr_now === false)
$this->build_ltrarray($letter+1,$letter2,$sig2);
//Ebenso für nächsten Buchstaben suchen
if ($pos_ltr_nxt === false or $pos_ltr_now == $pos_ltr_nxt)
$this->build_ltrarray($letter,$letter2+1,$sig2);
//Anzahl Buchstabe in Array einfügen
switch ($pos_ltr_nxt-$pos_ltr_now)
{
case 1:
//Buchstabe nur einmal vorhanden
$barray[$letter] = $barray[$letter]+1;
break;
default:
//Buchstabe x mal vorhanden
$barray[$letter] = $barray[$letter]+substr($sig2,$pos_ltr_now+1,$pos_ltr_nxt-1);
break;
}
//$sig2 kürzen
$sig2 = substr($sig2,$pos_ltr_nxt,strlen($sig2)-$pos_ltr_nxt);
if (strlen($sig2) >= 1)
$this->build_ltrarray($letter2,$letter2+1,$sig2);
}
}