Pregunta

Muchos lenguajes de programación tienen una función de fusión (devuelve el primer valor no NULL, ejemplo ). 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?

¿Fue útil?

Solución

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

Otros consejos

PHP 7 introdujo un verdadero operador de fusión :

echo 

PHP 7 introdujo un verdadero operador de fusión :

<*>

Si el valor antes de ?? no existe o es nulo , el valor después de tomar ?? .

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

GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

Si el valor antes de ?? no existe o es nulo , el valor después de tomar ?? .

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

Primer hit 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

Me gusta mucho el operador?:. Desafortunadamente, aún 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()));
}

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:

$id = coalesce(

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 cometa 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.

GET['id'],

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 cometa 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.

SESSION['id'], null);

Pero esto, en la mayoría de los casos, hará que PHP cometa 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.

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 ()

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

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

Vaya

Para superar esto, se requiere un segundo argumento y una 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 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 pudieras simplemente pasar isset o 'isset' como el segundo argumento para array_filter , pero no hay suerte.

Actualmente estoy usando esto, pero me pregunto si no podría mejorarse 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];
}

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top