php - remove - strip_tags wordpress
¿La mejor manera de hacer un cambio de PHP con múltiples valores por caso? (13)
¿Cómo harías esta declaración de cambio de PHP?
También tenga en cuenta que estas son versiones mucho más pequeñas, la 1 que necesito crear tendrá muchos más valores agregados.
Versión 1:
switch ($p) {
case ''home'':
case '''':
$current_home = ''current'';
break;
case ''users.online'':
case ''users.location'':
case ''users.featured'':
case ''users.new'':
case ''users.browse'':
case ''users.search'':
case ''users.staff'':
$current_users = ''current'';
break;
case ''forum'':
$current_forum = ''current'';
break;
}
Versión 2:
switch ($p) {
case ''home'':
$current_home = ''current'';
break;
case ''users.online'' || ''users.location'' || ''users.featured'' || ''users.browse'' || ''users.search'' || ''users.staff'':
$current_users = ''current'';
break;
case ''forum'':
$current_forum = ''current'';
break;
}
ACTUALIZACIÓN - Resultados de la prueba
Corrí un poco de prueba de velocidad en 10.000 iteraciones,
Time1: 0.0199389457703 // declaraciones if
Time2: 0.0389049446106 // cambiar instrucciones
Time3: 0.106977939606 // Arrays
La versión 2 no funciona !!
case ''users.online'' || ''users.location'' || ...
es exactamente lo mismo que:
case True:
y ese case
será elegido para cualquier valor de $p
, a menos que $p
sea la cadena vacía.
||
No tiene ningún significado especial dentro de una declaración de case
, no está comparando $p
con cada una de esas cadenas, solo está verificando si no es False
.
Algunas otras ideas aún no mencionadas:
switch(true){
case in_array($p, array(''home'', '''')):
$current_home = ''current''; break;
case preg_match(''/^users/.(online|location|featured|new|browse|search|staff)$/'', $p):
$current_users = ''current''; break;
case ''forum'' == $p:
$current_forum = ''current''; break;
}
Alguien probablemente se quejará de los problemas de legibilidad con el # 2, pero no tendría ningún problema en heredar código como ese.
Cambiar en combinación con variables le dará más flexibilidad:
<?php
$p = ''home''; //For testing
$p = ( strpos($p, ''users'') !== false? ''users'': $p);
switch ($p) {
default:
$varContainer = ''current_'' . $p; //Stores the variable [$current_"xyORz"] into $varContainer
${$varContainer} = ''current''; //Sets the VALUE of [$current_"xyORz"] to ''current''
break;
}
//For testing
echo $current_home;
?>
Para obtener más información, consulte las variables variables y los ejemplos que envié al manual de php:
Ejemplo 1 : http://www.php.net/manual/en/language.variables.variable.php#105293
Ejemplo 2 : http://www.php.net/manual/en/language.variables.variable.php#105282
PD: este código de ejemplo es PEQUEÑO Y SENCILLO , tal como me gusta. Está probado y funciona también
Coloque esos muchos valores en una matriz y consulte la matriz, ya que el caso de cambio parece ocultar la semántica subyacente de lo que está tratando de lograr cuando se utiliza una variable de cadena como condición, lo que dificulta su lectura y comprensión, por ejemplo :
$current_home = null;
$current_users = null;
$current_forum = null;
$lotsOfStrings = array(''users.online'', ''users.location'', ''users.featured'', ''users.new'');
if(empty($p)) {
$current_home = ''current'';
}
if(in_array($p,$lotsOfStrings)) {
$current_users = ''current'';
}
if(0 === strcmp(''forum'',$p)) {
$current_forum = ''current'';
}
Creo que la versión 1 es el camino a seguir. Es mucho más fácil de leer y entender.
Definitivamente prefiero la versión 1. La versión 2 puede requerir menos líneas de código, pero será extremadamente difícil de leer una vez que tenga muchos valores allí como lo está pronosticando.
(Honestamente, ni siquiera sabía que la Versión 2 era legal hasta ahora. Nunca lo había visto así antes).
En aras de la integridad, señalaré que la lógica de la "Versión 2" rota se puede reemplazar con una instrucción de conmutación que funcione, y también hacer uso de matrices para la velocidad y la claridad, como por ejemplo:
// used for $current_home = ''current''; $home_group = array( ''home'' => True, ); // used for $current_users = ''current''; $user_group = array( ''users.online'' => True, ''users.location'' => True, ''users.featured'' => True, ''users.new'' => True, ''users.browse'' => True, ''users.search'' => True, ''users.staff'' => True, ); // used for $current_forum = ''current''; $forum_group = array( ''forum'' => True, ); switch (true) { case isset($home_group[$p]): $current_home = ''current''; break; case isset($user_group[$p]): $current_users = ''current''; break; case isset($forum_group[$p]): $current_forum = ''current''; break; default: user_error("/$p is invalid", E_USER_ERROR); }
Hoy en día puedes hacer ...
switch ([$group1, $group2]){
case ["users", "location"]:
case ["users", "online"]:
Ju_le_do_the_thing();
break;
case ["forum", $group2]:
Foo_the_bar();
break;
}
La versión 1 es ciertamente más fácil a la vista, más clara en cuanto a sus intenciones y más fácil de agregar a las condiciones del caso.
Nunca he probado la segunda versión. En muchos idiomas, esto ni siquiera se compilaría porque cada etiqueta de caso debe evaluarse como una expresión constante.
Ninguna versión 2 realmente no funciona, pero si desea este tipo de enfoque, puede hacer lo siguiente (probablemente no sea el más rápido, pero podría decirse que es más intuitivo):
switch (true) {
case ($var === ''something'' || $var === ''something else''):
// do some stuff
break;
}
Para cualquier situación en la que tenga una cadena desconocida y necesite determinar con cuál de las otras cadenas coincide, la única solución que no se ralentiza a medida que agrega más elementos es utilizar una matriz, pero tiene todas Las posibles cadenas como claves. Por lo que su interruptor puede ser reemplazado con lo siguiente:
// used for $current_home = ''current'';
$group1 = array(
''home'' => True,
);
// used for $current_users = ''current'';
$group2 = array(
''users.online'' => True,
''users.location'' => True,
''users.featured'' => True,
''users.new'' => True,
''users.browse'' => True,
''users.search'' => True,
''users.staff'' => True,
);
// used for $current_forum = ''current'';
$group3 = array(
''forum'' => True,
);
if(isset($group1[$p]))
$current_home = ''current'';
else if(isset($group2[$p]))
$current_users = ''current'';
else if(isset($group3[$p]))
$current_forum = ''current'';
else
user_error("/$p is invalid", E_USER_ERROR);
Esto no se ve tan limpio como un switch()
, pero es la única solución rápida que no incluye escribir una pequeña biblioteca de funciones y clases para mantenerlo ordenado. Todavía es muy fácil agregar elementos a las matrices.
Si alguien más mantuviera su código, es casi seguro que tomaría una doble versión de la versión 2, lo que es extremadamente no estándar.
Me quedaría con la versión 1. Soy de la escuela, aunque las declaraciones de casos sin un bloque de enunciado propio deberían tener // fall through
comentario explícito al lado de ellos para indicar que de hecho es su intención fallar, eliminando así cualquier ambigüedad sobre si iban a manejar los casos de manera diferente y si se olvidaron o algo así.
if( in_array( $test, $array1 ) )
{
// do this
}
else if( stristr( $test, ''commonpart'' ) )
{
// do this
}
else
{
switch( $test )
{
case 1:
// do this
break;
case 2:
// do this
break;
default:
// do this
break;
}
}