with strip_tags remove quitar para funcion etiquetas ejemplo asp php optimization null-coalescing-operator

strip_tags - Función de fusión para PHP?



strip_tags wordpress (9)

Actualmente estoy usando esto, pero me pregunto si no se podría mejorar con algunas de las nuevas características en PHP 5.

function coalesce() { $args = func_get_args(); foreach ($args as $arg) { if (!empty($arg)) { return $arg; } } return $args[0]; }

Muchos lenguajes de programación tienen una función coalescente (devuelve el primer valor no NULL, example ). PHP, por desgracia en 2009, no lo hace.

¿Cuál sería una buena manera de implementar uno en PHP hasta PHP tiene una función de fusión?


Asegúrese de identificar exactamente cómo desea que funcione esta función con ciertos tipos. PHP tiene una amplia variedad de funciones de verificación de tipos o similares, así que asegúrese de saber cómo funcionan. Esta es una comparación de ejemplo de is_null () y empty ()

$testData = array( ''FALSE'' => FALSE ,''0'' => 0 ,''"0"'' => "0" ,''NULL'' => NULL ,''array()''=> array() ,''new stdClass()'' => new stdClass() ,''$undef'' => $undef ); foreach ( $testData as $key => $var ) { echo "$key " . (( empty( $var ) ) ? ''is'' : ''is not'') . " empty<br>"; echo "$key " . (( is_null( $var ) ) ? ''is'' : ''is not'') . " null<br>"; echo ''<hr>''; }

Como puede ver, empty () devuelve verdadero para todos estos, pero is_null () solo lo hace para 2 de ellos.


Estoy expandiendo 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 suele hacer una función de coalesce . Por ejemplo:

echo 42 === coalesce(null, 0, 42) ? ''Oops'' : ''Hooray'';

Uy

Para superar esto, se requiere un segundo argumento y definición de función. La función invocable es responsable de decirle a array_filter si se debe agregar o no el valor de la matriz actual a la matriz de resultados:

// "callable" function not_null($i){ return !is_null($i); // strictly non-null, ''isset'' possibly not as much } function coalesce(){ // pass callable to array_filter return array_shift(array_filter(func_get_args(), ''not_null'')); }

Sería bueno si simplemente pudiera pasar isset o ''isset'' como el segundo argumento para array_filter , pero no tuvo tanta suerte.


Hay un nuevo operador en php 5.3 que hace esto: ?:

// A echo ''A'' ?: ''B''; // B echo '''' ?: ''B''; // B echo false ?: ''B''; // B echo null ?: ''B'';

Fuente: http://www.php.net/ChangeLog-5.php#5.3.0


Me gusta mucho el operador?: Lamentablemente, todavía no está implementado en mi entorno de producción. Entonces uso el equivalente de esto:

function coalesce() { return array_shift(array_filter(func_get_args())); }


PHP 5.3+, con cierres:

function coalesce() { return array_shift(array_filter(func_get_args(), function ($value) { return !is_null($value); })); }

Demostración: https://eval.in/187365


PHP 7 introdujo un verdadero operador de coalescencia :

echo $_GET[''doesNotExist''] ?? ''fallback''; // prints ''fallback''

Si el valor antes de la ?? no existe o es null el valor después de la ?? se toma.

La mejora sobre el operador mencionado ?: es que el también maneja variables indefinidas sin lanzar un E_NOTICE .


Primer golpe para "php coalesce" en google.

function coalesce() { $args = func_get_args(); foreach ($args as $arg) { if (!empty($arg)) { return $arg; } } return NULL; }

http://drupial.com/content/php-coalesce


Vale la pena señalar que debido al tratamiento de PHP de las variables no inicializadas y los índices de matriz, cualquier tipo de función de fusión es de uso limitado. Me encantaría poder hacer esto:

$id = coalesce($_GET[''id''], $_SESSION[''id''], null);

Pero esto, en la mayoría de los casos, provocará que PHP tenga 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 en su fusión se han inicializado.