Pergunta

Com base nos exemplos A partir desta página, Eu tenho as amostras de código de trabalho e não funcionando abaixo.

Código de trabalho usando if declaração:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

Código que não trabalha usando operador ternário:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

ATUALIZAR
Depois da dica de Brian, descobri que ecoando $test produz o resultado esperado. O seguinte funciona como um charme!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Foi útil?

Solução

o

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

A sintaxe não é um operador "abreviado se" ? é chamado de operador condicional) porque você não pode executar o código da mesma maneira que se fizesse:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

No seu exemplo, você está executando o echo declaração quando o $address não está vazio. Você não pode fazer da mesma maneira com o operador condicional. O que você pode fazer no entanto, é echo O resultado do operador condicional:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

E isso exibirá "A rua está vazia!" Se estiver vazio, caso contrário, exibirá o endereço do Street2.

Outras dicas

Php 7+

A partir do Php 7, essa tarefa pode ser executada simplesmente usando o Operador nulo de coalescência assim :

echo !empty($address['street2']) ?? 'Empty';

Declaração básica verdadeira / falsa

$is_admin = ($user['permissions'] == 'admin' ? true : false);

Mensagem de boas -vindas condicionais

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Mensagem de itens condicionais

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

O operador ternário é apenas uma abreviação para e se/else Block. Seu código de trabalho não tem uma condição, portanto, não é adequado para isso.

O exemplo a seguir funcionará:

echo empty($address['street2']) ? 'empty' : 'not empty';

É o operador ternário, também conhecido como operador Elvis (Google It: P) que você está procurando.

echo $address['street2'] ?: 'Empty'; 

Ele retorna o valor da variável ou padrão se a variável estiver vazia.

Observe que Ao usar operadores condicionais aninhados, você pode usar parênteses Para evitar possíveis problemas!

Parece que o PHP não funciona da mesma maneira que pelo menos JavaScript ou C#.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

O mesmo código em JavaScript e C# retornam "excepcional" em ambos os casos.

No segundo caso, o que o PHP faz é (ou pelo menos é o que eu entendo):

  1. é $score > 10? sim
  2. é $age > 10? Não, então a corrente $age > 10 ? 'Average' : 'Exceptional' retorna 'excepcional'
  3. Então, em vez de apenas interromper toda a declaração e retornar 'excepcional', continua avaliando a próxima declaração
  4. A próxima declaração se torna 'Exceptional' ? 'Horrible' : 'Average' que retorna 'horrível', pois 'excepcional' é verdadeiro

Da documentação: http://php.net/manual/en/language.operators.comparison.php

Recomenda -se que você evite expressões ternárias de "empilhamento". O comportamento do PHP ao usar mais de um operador ternário em uma única declaração não é óbvio.

Mensagem de boas -vindas condicionais

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

PHP aninhado taquigrafia

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

Você pode fazer isso ainda mais curto substituindo echo com <?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

Isso é útil, especialmente quando você deseja determinar, dentro de uma barra de navegação, se a opção de menu deve ser exibida como já visitada (clicada) ou não:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

Aqui estão alguns exemplos interessantes, com uma ou mais condições variadas.

$value1 = '1';
$value2 = '2';
$value3 = '3';

// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";

// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";

// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";

// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";

Eu acho que você usou os colchetes da maneira errada. Experimente isso:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

Eu acho que deveria funcionar, você também pode usar:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

Há também um operador ternário abreviado e parece o seguinte:

(Expression1)?: Expression2 retornará expressão1 Se avaliar para verdadeiro ou expressão2 por outro lado.

Exemplo:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

retornará

Apples are great!

Desde o PHP 5.3, é possível deixar de fora a parte do meio do operador ternário. Expressão expr1?: Expr3 retorna expr1 se o expr1 avaliar para true e expr3 caso contrário.

De Manual do PHP

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top