0

Est-il possible de réécrire cela pour être plus court en quelque sorte?Existe-t-il une instruction if plus courte en PHP?

if (isset($_POST['pic_action'])){ 
    $pic_action=$_POST['pic_action']; 
} 
else { 
    $pic_action=0; 
} 

Je l'ai vu quelque part, mais oublié ...:/

BTW, s'il vous plaît expliquer votre code aussi si vous le souhaitez!

Merci

Répondre

18

Vous pouvez utiliser le conditional operator ?::

$pic_action = isset($_POST['pic_action']) ? $_POST['pic_action'] : 0; 

L'expression opérateur conditionnel expr1 ? expr2 : expr3 évalue à la valeur de retour de expr2 si la valeur de retour évaluée de expr1 est vrai; sinon l'expression évalue à la valeur de retour évaluée de expr3. Donc si isset($_POST['pic_action']) évalue à vrai, l'expression entière évalue à la valeur évaluée de $_POST['pic_action'] et à la valeur évaluée de 0 autrement.

Donc en bref: si isset($_POST['pic_action']) est vrai, $pic_action contiendra la valeur de $_POST['pic_action'] et 0 autrement.

+5

Plus communément/aussi connu sous le nom * opérateur ternaire * –

+2

@Justin Johnson: Mais pour être correct, il est juste * un opérateur ternaire * et non * l'opérateur ternaire *. (Bien qu'il n'y ait pas d'autre opérateur ternaire dans mon esprit en ce moment.) – Gumbo

+1

@Gordon: "Ternaire" décrit juste le nombre d'arguments qu'il implique (3), tout comme les opérateurs binaires ('+', '-', '/', etc) impliquent 2 arguments. – nickf

2
$pic_action=(isset($_POST['pic_action']))?($_POST['pic_action']):0; 
+2

Toutes ces parenthèses sont superflues. –

+1

espacement approprié * n'est pas * superflu si ... – nickf

+0

@Justin Johnson: Je préfère '($ pic_action = ((isset ($ _ POST ['pic_action']))? ($ _ POST ['pic_action']) :(0))); ';-) – Gumbo

0

plus longtemps, mais réutilisable:

$pic_action = QueryPost('pic_action', 0); 

function QueryPost($name, $default='', $valid=false) { 
    if (!isset($_POST[$name])) return $default; 
    if (($valid) and (empty($_POST[$name]))) return $default; 
    return $_POST[$name]; 
} 

Ou vous pourriez avoir la fonction QueryPost faire une forme de validation pendant que vous y êtes.

$pic_action = QueryPost('pic_action', 'int', 0); 

function QueryPost($name, $rule, $default='', $valid=false) { 
    // this shouldn't be too hard to write 
} 
8

La réponse de Gumbo est probablement la meilleure solution.

Il peut également être écrit:

$pic_action = 0; 
if (isset($_POST['pic_action'])){ 
    $pic_action=$_POST['pic_action']; 
} 
+2

J'utilise habituellement celui-ci sur l'opérateur ternaire, car je trouve plus facile de comprendre ce qui se passe ou quand il y a plus de logique à faire dans le bloc IF – Gordon

+0

J'évite l'opérateur ternaire et utilisez cette méthode pour que ma couverture de test soit plus utile. Alors que des valeurs spécifiques peuvent faire échouer un certain code, il est plus probable qu'une branche manquée (étant le calcul de la valeur dans le if ou ternary) conduira à des échecs. Pour la couverture de code 100% magique, seulement la moitié de toutes les branches ternaires peuvent encore être vérifiées. – Paul

0

Vous pouvez faire:

$_POST['pic_action'] = isset($_POST['pic_action']) ? $_POST['pic_action'] : 0; 
+2

Non - cela définirait '$ _POST ['pic_action']' soit 'true' s'il est défini, ou' 0' s'il n'est pas défini. '$ x = $ y?: $ z' est l'équivalent de' $ x = $ y? $ y: $ z' – nickf

+0

@nickf: Oui, vous avez absolument raison. –

+0

@Alix Axel: Et vous ne voulez pas changer votre réponse? – Gumbo

1
$pic_action = array_get($_POST, 'pic_action', 0); 

La ligne ci-dessus nécessite la fonction array_get définie ci-dessous. Source de Kohana's Arr class. Fonction très petite et générique. Peut être utilisé sur tous les tableaux, par ex. $_GET.

/** 
* Retrieve a single key from an array. If the key does not exist in the 
* array, the default value will be returned instead. 
* 
* @param array array to extract from 
* @param string key name 
* @param mixed default value 
* @return mixed 
*/ 
function array_get(array $array, $key, $default = NULL) 
{ 
    return isset($array[$key]) ? $array[$key] : $default; 
}