Muchos lenguajes de programación tienen una función de fusión (por ejemplo , devuelve el primer valor no NULL ). PHP, lamentablemente en 2009, no lo hace.
¿Cuál sería una buena manera de implementar uno en PHP hasta que PHP mismo obtenga una función de fusión?
??
para PHP 7.Respuestas:
Hay un nuevo operador en php 5.3 que hace esto:
?:
Fuente: http://www.php.net/ChangeLog-5.php#5.3.0
fuente
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
retornosfalse
. El operador es realmente cuerdo.PHP 7 introdujo un operador de fusión real :
Si el valor anterior
??
no existe o esnull
el valor posterior a??
toma.La mejora con respecto al
?:
operador mencionado es que??
también maneja variables indefinidas sin lanzar unE_NOTICE
.fuente
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over??
, sin embargo, es que fusiona también valores vacíos, lo que??
no funciona. De manera similar al comportamiento del operador lógico OR en JavaScript (es decir$val || 'default'
), creo que?:
es una forma más práctica de fusión si en nuestra práctica finalmente nos encontramos manejando tanto vacíos como nulos de la misma manera (es decir$val ?: 'default'
). Y si desea forzar el problema aún más y tragarE_NOTICE
, podría argumentar esto incluso:echo @$val ?: 'default';
Primer hit para "php coalesce" en google.
http://drupial.com/content/php-coalesce
fuente
Realmente me gusta el operador? Desafortunadamente, aún no está implementado en mi entorno de producción. Entonces uso el equivalente de esto:
fuente
coalesce
se supone que devuelve el primer argumento no nulo que encuentra, que incluiríaFALSE
. SinFALSE
embargo, esta función se descartará , probablemente no lo que op tiene en mente (al menos no lo que quisiera de unacoalesce
función).Vale la pena señalar que, debido al tratamiento de PHP de variables no inicializadas e índices de matriz, cualquier tipo de función de fusión es de uso limitado. Me encantaría poder hacer esto:
Pero esto, en la mayoría de los casos, hará que PHP produzca un error con un E_NOTICE. La única forma segura de probar la existencia de una variable antes de usarla es usarla directamente en empty () o isset (). El operador ternario sugerido por Kevin es la mejor opción si sabe que se sabe que todas las opciones de su fusión están inicializadas.
fuente
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).??
para hacer que esta operación muy común sea más concisa.Asegúrese de identificar exactamente cómo desea que esta función funcione con ciertos tipos. PHP tiene una amplia variedad de verificación de tipos o funciones similares, así que asegúrese de saber cómo funcionan. Este es un ejemplo de comparación de is_null () y empty ()
Como puede ver, empty () devuelve verdadero para todos estos, pero is_null () solo lo hace para 2 de ellos.
fuente
Estoy ampliando la respuesta publicada por Ethan Kent . Esa respuesta descartará los argumentos no nulos que se evalúan como falsos debido al funcionamiento interno de array_filter , que no es lo que
coalesce
normalmente hace una función. Por ejemplo:Para superar esto, se requiere un segundo argumento y una definición de función. La función invocable es responsable de decir
array_filter
si se agrega o no el valor de matriz actual a la matriz de resultados:Sería bueno si pudieras simplemente pasar
isset
o'isset'
como el segundo argumentoarray_filter
, pero no tanta suerte.fuente
Actualmente estoy usando esto, pero me pregunto si no podría mejorarse con algunas de las nuevas características en PHP 5.
fuente
PHP 5.3+, con cierres:
Demostración: https://eval.in/187365
fuente