Tengo la siguiente matriz:
$matches[0] = "123"; $matches[1] = "987"; $matches[2] = "121";Y la siguiente cadena:
$result = "My phone number is {0} and police number is {2}"; Me gustaría reemplazar el marcador de posición {} basado en la matriz $matches , en caso de que no haya ninguna coincidencia para el marcador de posición, no se muestra nada en su lugar.
¿Cuál es la mejor manera de lograrlo, o conoce una mejor solución a mi problema?
(En este momento estoy construyendo el sistema, así que en lugar de corchetes podría usar cualquier otro símbolo)
En python esto es posible usando la función .format() .
Puede hacerlo con vsprintf , no tiene que cambiar el orden de los artículos si da el número (de 1) de su artículo así: %n$s (donde n es el número):
$matches = [ "123", "987", "121"]; $result = 'My phone number is %1$s and police number is %3$s'; $res = vsprintf($result, $matches); Tenga en cuenta que debe colocar la cadena formateada entre comillas simples; de lo contrario, $s se interpretará como una variable y se reemplazará con nada.
( vprintf y vsprintf están diseñados para matrices, pero puede hacer lo mismo con printf y sprintf para variables separadas, funciona igual)
Si no puede cambiar su cadena original con formato de Python, la forma es usar preg_replace_callback :
$matches = [ "123", "987", "121"]; $result = 'My phone number is {0} and police number is {2}'; $res = preg_replace_callback('~{(\d+)}~', function ($m) use ($matches) { return isset($matches[$m[1]]) ? $matches[$m[1]] : $m[0]; }, $result); o puede crear una matriz asociativa donde las claves son marcadores de posición y valores de los valores de su matriz, y usar strtr para el reemplazo:
$matches = [ "123", "987", "121"]; $result = 'My phone number is {0} and police number is {2}'; $trans = array_combine( array_map(function ($i) { return '{'.$i.'}'; }, array_keys($matches)), $matches ); $result = strtr($result, $trans);