simbolo operadores operador igual expresiones diferente comparar php short-circuiting

php - operadores - Uso de cortocircuitos para obtener la primera variable no nula



php<=> (8)

A partir de PHP 7, puede utilizar el operador de unión nula :

El operador de unión nula (??) se ha agregado como azúcar sintáctica para el caso común de la necesidad de usar un ternario junto con isset (). Devuelve su primer operando si existe y no es NULL; De lo contrario, devuelve su segundo operando.

// Coalescing can be chained: this will return the first // defined value out of $_GET[''user''], $_POST[''user''], and // ''nobody''. $username = $_GET[''user''] ?? $_POST[''user''] ?? ''nobody'';

¿Cuál es el equivalente de lo siguiente (basado en el estilo JS) en PHP:

echo $post[''story''] || $post[''message''] || $post[''name''];

Así que si la historia existe entonces publica eso; o si existe un mensaje post eso, etc ...


Dado que ambos or y || No devuelvas uno de sus operandos que no es posible.

Podrías escribir una función simple para ello aunque:

function firstset() { $args = func_get_args(); foreach($args as $arg) { if($arg) return $arg; } return $args[-1]; }


Esa sintaxis hará eco de 1 si cualquiera de estos está establecido y no es falso, y 0 si no.

Aquí hay una forma de una línea de hacer esto que funciona y que puede extenderse para cualquier número de opciones:

echo isset($post[''story'']) ? $post[''story''] : isset($post[''message'']) ? $post[''message''] : $post[''name''];

... aunque bastante feo. Edit: Mario''s es mejor que el mío, ya que respeta el orden arbitrario elegido como lo hace, pero a diferencia de esto, no se vuelve más feo con cada nueva opción que agregas.


Hay una sola línea para eso, pero no es exactamente más corta:

echo current(array_filter(array($post[''story''], $post[''message''], $post[''name''])));

array_filter le devolvería todas las entradas no nulas de la lista de alternativas. Y current solo obtiene la primera entrada de la lista filtrada.


Porque la variedad es el condimento de la vida:

echo key(array_intersect(array_flip($post), array(''story'', ''message'', ''name'')));


Puedes probarlo

<?php echo array_shift(array_values(array_filter($post))); ?>


Sería (PHP 5.3+) :

echo $post[''story''] ?: $post[''message''] ?: $post[''name''];

Y para PHP 7 :

echo $post[''story''] ?? $post[''message''] ?? $post[''name''];