Horn: Fehler in Rekursion

Beitrag lesen

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);  
}  
	}