No PHP, a substituição variável condicional é possível?
-
26-09-2019 - |
Pergunta
Eu queria saber se algo como o seguinte seria possível no PHP:
<?php echo "Hello {isset($name) ? $name : 'World'}!\n"; ?>
Ou eu tenho que fazer o seguinte?
<?php echo "Hello " . ( isset($name) ? $name : 'World' ) . "!\n"; ?>
Em geral, prefiro a substituição da concatenação, pois acho que a concatenação da string pode dificultar a leitura, tornando -as excessivamente longas.
O contexto é que estou decidindo qual opção em uma tag selecionada deve ser selecionada por padrão com base em uma consulta de banco de dados.
O contexto completo:
<?php
echo "
<form action='add_demographics.php' method='post'>
<table>
<input type=hidden name=userId value='{$_SESSION['username']}'/>
<tr><td>User ID:</td><td>{$_SESSION['username']}</td></tr>";
foreach ($inputLabels as $i => $value)
{
echo "
<tr>
<td>{$value['text']}</td>
<td><select name=$i>";
foreach ($value["options"] as $optionName => $optionValue)
{
echo "
<option value=$optionValue {($result[$i]==$optionValue ? ' selected=true' : '')}>$optionValue</option>";
}
echo "
</select></td>
</tr>";
}
echo "
<tr><td><input type='submit' name='submit' value='Submit' /></td></tr>
</table>
</form>";
?>
Solução
Você poderia fazer algo assim:
$default = "World";
$name = "Dunes";
echo "Hello {${isset($name) ? 'name' : 'default'}}";
Atualização do WebBiedave:
"Nunca faça isso, pois é uma prática de codificação absolutamente atroz usar o operador ternário para fazer referência a uma variável fora da variável simplesmente para evitar concatenação!
Outras dicas
Não, não pode fazer isso. Você precisa fazer isso fora da corda e concat. A única coisa que o PHP fará dentro de uma string é procurar e avaliar um único $ var (sem expressões) - se você usar citações duplas ou heredoc equivalente (o PHP não avalia VARs em citações únicas)
Não, não é possível fazer isso da maneira que você está perguntando.
Uma solução para o seu problema específico, no entanto, pode ser atribuir uma variável na parte superior do loop foreach para sustentar se essa opção deve ou não ser selecionada e ecoar essa variável como parte da sua saída:
foreach ($value["options"] as $optionName => $optionValue)
{
$selected = $result[$i] == $optionValue ? "selected='selected'" : "";
echo "
<option value=$optionValue $selected>$optionValue</option>";
}
<?
function is($var,$sub){
return isset($var)?$var:$sub;
}
echo 'Hello, '.is($name,'World').'!\r\n';
$name = 'Bob';
echo 'Hello, '.is($name,'World').'!\r\n';
?>
Talvez por mais curto isso?
Dado o que você quer fazer. eu diria
$string = isset($name) ? $name : 'World';
$result = "Hello $string!\n";
echo $result;
Nunca é realmente necessário.
Aprenda a usar modelos. HTML deve ser HTML, não alguns dados abstratos codificados no PHP
<form action='add_demographics.php' method='post'>
<table>
<input type=hidden name=userId value='<?=_h($_SESSION['username'])?>'/>
<tr><td>User ID:</td><td><?=_h($_SESSION['username'])?></td></tr>
<? foreach ($inputLabels as $i => $value): ?>
<tr>
<td><?=_h($value['text'])?></td>
<td><select name="<?=$i?>">
<? foreach ($value["options"] as $optionName => $optionValue): ?>
<option value="<?=$optionValue?>" <? if ($result[$i]==$optionValue): ?> selected=true<? endif ?>>
<?=$optionValue?>
</option>
<? endforeach ?>
</select></td>
</tr>
<? endforeach ?>
<tr><td><input type='submit' name='submit' value='Submit' /></td></tr>
</table>
</form>