Estoy construyendo un sitio web que contiene usuarios con perfiles de usuario. Muchos de los campos en el perfil son opcionales.¿Qué es una solución más elegante a estas declaraciones if/elseif anidadas?
Existe una gran cantidad de contenido generado por los usuarios, por lo que debo mostrar el autor de este contenido en diferentes ubicaciones del sitio (comentarios, publicaciones, etc.). En el perfil del usuario, puede (opcionalmente) completar su "nombre", su "apellido" y un "nombre para mostrar".
Para mostrar el autor, escribí un método de ayuda que se ve a través de una matriz provista de estos campos y devuelve el nombre más adecuado para el usuario, en este orden de preferencia:
- Si el usuario llenada
display_name
, esto se mostrará. - Si el usuario llenada
first_name
ylast_name
, pero sindisplay_name
, mostrará los dos nombres - Si el usuario sólo llenada
first_name
, se mostraráfirst_name
. - Si el usuario solo completó
last_name
, mostrarálast_name
. - Si todo lo demás falla, un identificador de usuario se mostrará es decir
user123
- Si ninguna de las claves de matriz están presentes, o el parámetro es NULL, el nombre se mostrará como
NULL
El método funciona muy bien , pero es feo Debe haber una manera de embellecer esto con una alternativa a las declaraciones if/else anidadas.
public function nameify($names = NULL) {
$name = '';
if (!empty($names)) {
if (!empty($names['display_name'])) {
$name = $names['display_name'];
} elseif (!empty($names['first_name'])) {
$name = $names['first_name'];
if (!empty($names['last_name'])) {
$name .= ' ' . $names['last_name'];
}
} elseif (!empty($names['last_name'])) {
$name = $names['last_name'];
}
if (empty($name) && !empty($names['id'])) {
$name = 'user' . $names['id'];
} else {
$name = 'NULL';
}
} else {
$name = 'NULL';
}
return $name;
}
Sólo mal uso de 'operador return'. Se puede llamar no solo al final de la función sino a cualquier parte. Y * terminará la ejecución adicional *. Al igual que 'goto' hace. Vea la respuesta de x3ro para el ejemplo –