Einzelnen Beitrag anzeigen
  #11  
Alt 04.06.2007, 09:17:12
s.heinrich s.heinrich ist offline
Anfänger
 
Registriert seit: Jun 2007
Beiträge: 11
AW: Einfache Rekursive Funktion - Ausgabe wird abgebrochen

Hallo,

das Problem wurde zwar nicht gelößt, aber der Weg zum Ziel ist nun leider ein anderer. Es ist nicht das, was ich wollte... aber wenigstens gehts auf die Weise.
Bitte fragt mich nicht, warum es mit einer while-Schleife geht und eine rekursive Funktion scheitert, denn nichts anderes habe ich getan (tun müssen).

Offensichtlich ein Apache-Bug
So werden alle Items angezeigt:
PHP-Code:
<?php
error_reporting
(E_ALL);

function 
countChar($str,$search){
    if(
trim($str)==false || !strstr($str,$search))return 0;
    
$zeichen = array();
    for (
$i=0$i<strlen($str); $i++)
        if(isset(
$zeichen[$str{$i}]))$zeichen[$str{$i}]++;
        else 
$zeichen[$str{$i}]=1;
    return 
$zeichen[$search];
}
function 
printItem($str,$int){
    echo 
"<code>($int) $str</code><br>\n";
    return 
true;
}

//*** DEFINIERE ***
$int_max_item=4000;
$str_word='a*b*c*d';// (*) Zeichen werden ersetzt (egal, wie viele)
$int_ct_stern countChar($str_word,'*');//Anzahl Zeichen
$ar_abc=array('ä','ö','ü','ß','+','-','a','b','c','d','e'
    
,'f','g','h','i','j','k','l','m','n','o'
    
,'p','q','r','s','t','u','v','w','x','y','z');//Pool an Zeichen
//$ar_pool defin., $ar_pool[$x]=Wert, Wert wird rekur. hochgezählt
//oder ggf. zurückgesetzt
for($x=0$x<$int_ct_stern$x++)$ar_pool[$x]=0;
$int_ct_abc   count($ar_abc);//Anzahl Zeichen
$int_last_x   $int_ct_stern-1;// letzter Schlüssel
$int_zaehler  0;

//*** PRINT INFO ***
echo "<p><b>$int_ct_stern</b> Sternchen gefunden.<br>
    <b>$int_ct_abc</b> Zeichen stehen zur Verfügung.<br>
    Das enstpricht <b>"
.number_format(bcpow($int_ct_abc,$int_ct_stern,0),0,'','.')
    .
"</b> Möglichkeiten<br>
    <b>$int_max_item</b> Einträge sollen ausgegeben werden.</p>\n"
;

//*** START ***
while ( $ar_pool[0] < $int_ct_abc ) {
    
// 1. Prüfung der Werte (Testlauf)
    // 2. Ersetzen der Sternchen und Ausgabe
    // 3. In jedem Durchlauf wird ein Satz an Zeichen für das Ersetzen 
    //    der Sternchen im nkommenden Durchlauf erzeugt
    //    (Anzahl entspr. der Sternchen).
    
$int_zaehler++;
    
$str_word2=$str_word;//Kopie vom Orig.
    
$ar_curr_abc=array();//Werte für 1 Einsatz
    //So oft wie Sternchen vorhanden das Array 
    //mit den zugewiesenen Zeichen durchlaufen
    //Werte Prüfen und Zeichen in curr_abc für das folgende Ersetzen def.
    
for($x=0$x<$int_ct_stern$x++){
        if(!isset(
$ar_pool[$x]))die(" ERROR #".__LINE__." [$x] ");
        if(
$ar_pool[0]>=$int_ct_abc)return;//die(" Pool Ende erreicht ");
        
if($ar_pool[$x] == $int_ct_abc)die(" ERROR #".__LINE__." ");
        if(!isset(
$ar_abc[$ar_pool[$x]]))die(" ERROR #".__LINE__." ");
        
$ar_curr_abc[$x]=$ar_abc[$ar_pool[$x]];//zeichen def.
    
}
    
//Curr Zeichensatz verarbeiten
    
foreach($ar_curr_abc as $k => $v){
        
$t=strpos($str_word2,'*');
        
$str_word2{$t}=$v;
        if(
strpos($str_word2,'*')===false)
            if(
printItem($str_word2,$int_zaehler)==false)
                die(
" ERROR #".__LINE__." ");

    }
    
//Neuen durchlauf vorbereiten
    //Rückwärts aktualisieren
    //Letzter zählt immer weiter, andere nur wenn Vorgänger Reset
    
$ar_reset=array();//Hilfs-Array, ob 0 im Vorg. wirklich aus einem Reset erfolgte
    
for($x=$int_last_x$x >= 0$x--){
        if( 
$ar_pool[$x]+== $int_ct_abc && $x!=
            
&& ($x==$int_last_x || isset($ar_reset[$x+1]))){
            
$ar_pool[$x]=0;//Reset
            
$ar_reset[$x]=true;
        
        
//nur beim letzten immer +1, sonst nur wenn Vorgänger Reset
        
}elseif( $x==$int_last_x || $x!=$int_last_x 
            
&& ($ar_pool[$x+1])==&& isset($ar_reset[$x+1])){
            
$ar_pool[$x]++;
        }
    }
    
//Ende, wenn Grenzwert für Ausgabe erreicht
    
if( $int_zaehler >= $int_max_item)break;
}
echo 
'<div style="height:300px"></div>';//Space
?>
Viele Grüße und danke an die, die mir antworteten,
Sven
Mit Zitat antworten