Lena Zimmermann: callfunction mit parameter by reference

Hallo zusammen,

ich würde gerne eine callback Funktion mit Parametern by reference aufrufen.

Dies mein kleines Beispiel (Datei öffnen, einlesen und in jeder Zeile Teile ersetzen. Die zu ersetzenden Teile sind in einem Array angegeben)

  
function test($item1, $key, &$str) {  
 $str = str_replace  (  $key, $item1, $str);  
}  
  
$layout = fopen("layout.css","w");  
$datei = fopen("layout2parse.css","r");  
$toreplace = array( 'defgrey' => '#00ff00');  
  
while($line = fgets($datei, 1024)){  
 array_walk($toreplace, 'test', $line);  
 fwrite($layout, $line);  
}  

Leider wird das & in der Funktionsdeklaration ignoniert, die Variable also nur in Funktion geändert, nicht im "Hauptprogramm". Es geht, in dem ich das & in den Funktionsaufruf packe, das ist aber deprecated. Was also kann ich tun?

Gruß
Lena

  1. array_walk($toreplace, 'test', $line);

    Ich nehme mal an, dass genau hier dein Problem liegt. Innerhalb von array_walk wird vmtl. nicht $toreplace[index] an die Funktion übergeben, sondern eine extra Variable, die dann auch korrekt überschrieben wird.

    Lösung: verwende foreach, durchlaufe $toreplace und führe dort deine Funktionsaufruf durch.

  2. Hallo Lena,

    Leider wird das & in der Funktionsdeklaration ignoniert, die Variable also nur in Funktion geändert, nicht im "Hauptprogramm".

    Ja, weil Deine Funktion selbst zwar die Variable als Referenz akzeptiert, array_walk aber nicht.

    In Deinem konkreten Fall hast Du aber eine viel einfachere Möglichkeit, als eine Extra-Funktion und array_walk:

    $line = str_replace (array_keys ($toreplace), array_values ($toreplace), $line);

    str_replace akzeptiert (genauso wie übrigens z.B. auch preg_replace) nämlich auch Arrays (siehe PHP-Handbuch).

    Für andere Fälle musst Du halt wirklich foreach nehmen oder array_walk mit Referenzparameter nachprogrammieren.

    Viele Grüße,
    Christian