Kleines Array-Problem

scanline

Erfahrenes Mitglied
Hallo,
folgendes funzt net:
Ich habe

1. eine Funktion
function pruefe ($string){
$checkchars = array("H","T","s",...); // Aray mit Prüfwerten
while(list($k,$v)=each($checkchars)) {
$string=str_replace("$v","_",$string);
}
return $string;
}


2. mehrere zu überprüfende Strings
$str1="Heute ist";
$str2="kein schöner Tag";
...

alle sollen einer Zeichenüberprüfng unterzogen werden:

$str1 = pruefe($str1);
$str2 = pruefe($str2);
...

Effekt:
Es wird immer nur jeweils der erste übergebene String geprüft!
Danach nix mehr. Scheint als verliert $chekchars nach dem ersten Durchlauf seine Gültigkeit!
Bereits versucht habe ich den Zeiger von $checkchars durch reset($checkchars) zurück zu setzen, ohne Erfolg.

Hat jemand ne Idee?

Gruß und Dank
Micha
 
Hm... kann ich leider nicht nachvollziehen. Bei mir (PHP 4.3.0, Windows 2000) läuft dein Code einwandfrei. Vielleicht liegt der Fehler in einem anderen Codeteil?
 
gelöst

so,2 Sachen

1. gelöst
...mit:

foreach($checkchars as $v) {
statt
while(list($k,$v)=each($checkchars)) {


2. die function war eigentlich eine Methode,vieleicht hängts damit zusammen, kann ich mir aber net vorstellen. Hier der ganze Kontext:


<?
class meine_klasse(){
var $checkchars = array(" ","!","§","\$","(",")"...);

function convert_bad_chars($string) {
while(list($k,$v)=each($this->checkchars)) {
$string=str_replace("$v","_",$string);
}
return $v1;
}

}


$mj = new meine_klasse();
$string1="Tolle Sache)/$/&";
$string2="%&/naja$/&";

$string1=$mj->convert_bad_chars($string1);
$string2=$mj->convert_bad_chars($string2);
?>

Und damit ging es nicht (machte er es nur bei $string1), mit foreach jedoch bei beiden (allen)...warum auch immer.

Vielen dank für die Mühe dennoch!
Micha
 
Natürlich geht das nicht, das ist ja auch was ganz anderes! Beim ersten mal wurde das Array bei jedem Funktionsaufruf neu deklariert und initialisiert und beim Verlassen der Funktion wieder gelöscht. Bei der Klasse bleibt das Array natürlich nach dem Funktionsaufruf erhalten, und muss daher auch zurückgesetzt werden. Ein reset an der richtigen Stelle hätte das Problem auch gelöst.
 
resetet hatte ich ihn vergeblich:

function convert_bad_chars($string) {
while(list($k,$v)=each($this->checkchars)) {
$string=str_replace("$v","_",$string);
}
reset($this->checkchars);
return $string;
}

oder war das so falsch?
gruß
micha
 
...zumal...
wo ist hinsichtlich der initialisierung der Unterschied zwischen der Abfrage per foreach und while? Leuchtet mir auch nicht richtig ein...

naja, jedenfalls schonmal ein Teilerfolg durch jetzige Funktionalität.

Gruß
micha
 
Das while ist da eigentlich gar nicht der Übeltäter, sondern das each(). Damit das ganze überhaupt funktioniert, muss ja bei jedem Aufruf von each() der interne Arrayzeiger inkrementiert werden, damit beim nächsten Aufruf von each() auch das nächste Arrayelement zurückgegeben wird. Wenn man jetzt das ganze Array erneut durchlaufen will, muss man den Arrayzeiger wieder auf 0 setzen (mit reset()).
foreach ist eine speziell für Arrays ausgelegte Schleifenkonstruktion und erledigt die Arrayzeigeroperationen automatisch. Deswegen braucht man am Ende der Schleife auch kein reset().
 
Zurück