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]+1 == $int_ct_abc && $x!=0
&& ($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])==0 && 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