2010-12-07 1 views
1

z. Ich möchte Instanzen einiger Wörter mit ihren String-Länge ersetzenPHP: Wie erhält man den aktuellen Wert eines Arrays, das innerhalb einer eingebauten Funktion wie strpos durchlaufen wird?

„XXXX größer als XX“ wird „4 größer als 2“

-Code, den ich zu schreiben beabsichtigen:

$myStrings = Array("XX","XXX","XXXX","XXXXX"); 
$outStr = str_replace($myStrings,strlen(current($myStrings)),$outStr); 

Aber Hier funktioniert CURRENT nicht.

P.S. Bitte schlagen Sie keine Workarounds vor, um das zu tun, da das nicht das ist, was ich dem Forum stellen möchte. Meine Abfrage ruft den aktuellen Zeiger auf ein Array ab, das intern durchlaufen wird.

Vielen Dank.

Antwort

1

Die Funktion, die Sie suchen, ist array_map. Es wendet eine Funktion auf alle Elemente eines Arrays und gibt die Ergebnisse als neues Array:

$myStrings = Array("XX","XXX","XXXX","XXXXX"); 
$outStr = str_replace($myStrings,array_map('strlen', $myStrings)),$outStr); 

Dies könnte ein neues Problem schaffen, wie XXXX wird mit 22 ersetzt werden, bevor XXXX geprüft wird. Die Lösung dazu wäre das Eingangsarray umzukehren:

$myStrings = array_reverse(Array("XX","XXX","XXXX","XXXXX")); 
$outStr = str_replace($myStrings,array_map('strlen', $myStrings)),$outStr); 
+0

@Matjis: aber wird dies sicherstellen, dass Strlen auf die aktuelle Nadel angewendet wird, die von $ myStrings Heuhaufen überprüft wird? – DhruvPathak

+0

@Dhruv: Der Trick hier ist, dass der Code ein Array erstellt, das die Ersatzwerte enthält, dann einen 1-zu-1-Austausch von einem Array zum anderen durchführt. – BoltClock

+0

Wie BoltClock sagt. Probieren Sie es aus, es funktioniert. – Matijs

0

Ich glaube nicht, dass Sie können. Da es eine interne Implementierung ist, was würde PHP Ihnen zur Verfügung stellen, die Sie verwenden könnten, um das aktuelle Element zu bestimmen?

beachten, dass dies den Zugriff auf interne Array Zeigern unterscheidet unter Verwendung current(), key(), next(), reset() et al. Ich verweise auf die Tatsache, dass PHP eine interne Implementierung von str_replace() für die Behandlung von Ersetzungen von Arrays von Strings hat.

Ein schneller Test zeigt, dass PHP scheint nicht einmal mit Array-Pointer zu stören, wenn sie mit str_replace() ersetzen trotzdem:

$arr = array('a', 'b', 'c');    // Internal pointer is at a 
$str = 'abc'; 
next($arr);        // Internal pointer is at b 
echo str_replace($arr, 'x', $str), "\n"; // xxx 
echo current($arr), "\n";    // b 

Oh, übrigens, das ist, was the manual for str_replace() sagt (starke Betonung von mir) :

Wenn search ein Array und replace ein String ist, dann ist dieser Ersatz-Zeichenfolge verwenden d für jeder Wert von search.

So speziell für str_replace(), ich glaube nicht, dass es jemals für Sie in einem Ersatz-String zu übergeben beabsichtigt war, die basierend auf dem Eingangsfeld dynamisch ist.

+0

Danke, das war hilfreich. Ich würde dann besser eine Schleife schreiben. – DhruvPathak

+0

@Dhruv: Sie können auch 'preg_replace()' verwenden, um die Notwendigkeit eines Arrays zu eliminieren. @ mck89 hat eine Antwort darauf gepostet, aber gelöscht, vermutlich weil du angegeben hast, keine Problemumgehungen zu posten. Vergewissern Sie sich, dass Sie auf das Häkchen neben einer Antwort klicken, um es als akzeptiert zu markieren. Fröhliches Hacken! – BoltClock

Verwandte Themen