Supongamos que tengo una estructura de datos como esta:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
Donde «mensaje» y «acción» son opcionales. Para comprobar si están presentes, mi primer intento sería escribir algo como esto:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
¿Existe una implementación más limpia?
Comentarios
- Ver también: stackoverflow.com/questions/2948948/… Puede escribir una función de utilidad array_key_exists que funcione de forma recursiva.
Respuesta
No, esto es simplemente la forma de hacerlo.
Incluso cuando no estoy limitado a un determinado lenguaje de script, ¿no puedo pensar en una solución más limpia?
Responder
¡Puede hacer esto!
if (isset($array["message"]["action"])) { /*...*/ }
Prueba:
<?php error_reporting(E_ALL); ini_set("error_reporting", E_ALL); ini_set("display_errors", 1); $array = [ "id" => 1, "name" => "foo", "message" => [ "action" => "PUT", ], ]; var_dump(isset($array["message"]["action"])); // true $array = [ "id" => 1, "name" => "foo" ]; var_dump(isset($array["message"]["action"])); // false
No hay entradas de registro.
Tenga en cuenta que si su valor es null
, entonces isset también devolverá falso. Probablemente no debería «crear valores con null
.
Comentarios
- A esta respuesta también le falta un
)
y puede causar que se genere una entrada de registro debido a que no se verificaisset($array['message'])
antes de eliminar la referencia. - @Brythan no, no genera una entrada de registro. Pero sí, falta un
)
. - Lo siento, quería señalar que ' tendrías que Ponga en marcha su informe de errores. Absolutamente provoca una entrada de registro si tiene configurado el informe de errores. ' he tenido spam en mis registros con eso anteriormente. Este fue el registro predeterminado en un momento. Es posible que ahora no sea el predeterminado (o que su host haya marcado el informe de errores), pero estoy absolutamente seguro de que esa situación puede generar una entrada de registro bajo ciertas configuraciones.
- No, realmente no ' t ¡Lo probé con todos los informes de errores activados!
Respuesta
No más claro, pero probablemente la solución más rápida:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
La segunda verificación es necesaria porque algunos valores se evaluaron con isset()
resultará falso a pesar de que el índice exista.
Respuesta
«Estoy usando esto en un proyecto mío, pero» m usando null
como estado silenciado. (php 5.6)
<?php function &option_select($options, $default, ...$path) { if(!isset($path[0])) { return $options; } $cursor = &$options; foreach($path as $key) { if(isset($cursor[$key])) { $cursor = &$cursor[$key]; } else { return $default; } } return $cursor; }
Es una función que buscará un path
en un árbol.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
Como puede ver. Estoy recorriendo los valores en una matriz: path
. Al principio, estoy estableciendo un cursor como referencia a una matriz en la que tengo que buscar. Cada vez que encuentro una tecla new
, estoy estableciendo la referencia del cursor al la clave actual que estoy buscando. Si tiene xdebug
y una buena GUI, puede reescribirla en el algoritmo que desee. Es el isset($cursor[$key])
tienes que cambiar. O inyectelo como una función: f($cursor, $key, $default) => (bool)
Comentarios
- Ha proporcionado una solución alternativa pero ha no revisado el código. Por favor, agregue una explicación sobre por qué esta sería una mejor solución para el OP, en lugar de la que ya tienen.
- Porque no es ' t SirPython fuertemente tipado. De esta manera puedo probarlo con pruebas unitarias, sin hacer una prueba unitaria para cada ' hardcoded-string '. También tiene que ver con la capacidad de prueba y la velocidad con la que puedo crear código de trabajo.
Respuesta
He estado buscando un código similar solución yo mismo y se me ocurrió esto. Funciona para determinar si la clave está configurada, y devolverá VERDADERO incluso si el valor de la clave «acción» es NULO.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
If $array["message"]
no tiene claves, el isset
devolverá FALSE deteniendo la instrucción IF. Si $array["message"]
tiene claves, incluso las que tienen valores NULL, isset
devolverá TRUE, lo que le permitirá comprobar de forma segura si "action"
La clave de matriz existe en $array["message"]
.