hago traductor de cifrado. Tengo un problema con la traducción de caracteres cifrados que terminan en puntos. Tengo el siguiente diccionario:
$dict = array( "I"=>"1", "L"=>"1.", "O"=>"0", "Q"=>"0.", "Z"=>"2", "?"=>"2." );Cuando uso esto:
function decode($cypher,$dict){ $sepp = explode(" ",$cypher); foreach($sepp as $char){ echo array_search($char,$dict); }} decode("1. 0. 2.",$dict);Estoy obteniendo:
IOZEn lugar de lo esperado:
LQ?De forma predeterminada, array_search realiza la misma comparación que el operador == , que intentará "escribir malabarismos" con ciertos valores. Por ejemplo, '1' == 1 , '1.' == 1 y '1.' == '1' son todos verdaderos.
Eso significa que '1' y '1.' siempre coincidirá con el mismo elemento en su tabla de búsqueda.
Afortunadamente, la función toma un tercer argumento, que el manual describe como:
Si el tercer parámetro
strictse establece entrue, la funciónarray_search()buscará elementos idénticos en elhaystack. Esto significa que también realizará una comparación de tipo estricta de laneedleen elhaystack, y los objetos deben ser la misma instancia.
Esto lo hace equivalente al operador === en su lugar. Tenga en cuenta que '1' === 1 , '1.' === 1 y '1.' === '1' son todos falsos.
Entonces solo necesitas agregar ese argumento:
echo array_search($char,$dict,true);Solo necesitas hacer una búsqueda estricta.
Consulte el tercer parámetro de array_search.
function decode($cypher,$dict){ $sepp = explode(" ",$cypher); foreach($sepp as $char){ echo array_search($char,$dict,true); } }La razón por la que no funciona es porque php piensa que 1 y 1 son el mismo número.
Esta línea te ayudaría. Establezca el tercer parámetro en true . Esto hace que la comparación se ejecute en modo estricto.
echo array_search($char, $dict, true);
function decode($cypher, $dict) { $sepp = explode(" ",$cypher); foreach ($sepp as $char) { echo array_search($char, $dict, true); } }