2011-11-20 8 views
23

Qual è l'equivalente dei seguenti (con sede in stile JS) in PHP:Utilizzando corto circuito per ottenere prima variabile non nullo

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

Quindi, se esiste storia, allora Post che; o se il messaggio esiste post, ecc ...

+1

qual è il punto in tale operatore?Non sai che tipo di variabile vuoi esportare? –

+1

Per soli 2 argomenti è possibile utilizzare: 'echo isset ($ _ POST ['story'])? $ _POST ['story']: $ _POST ['message']; ', alla fine prova a nidificarlo. – mj82

+1

Si basa su Facebook api stream; ne esiste solo uno/due su tre per post. –

risposta

37

Sarebbe (PHP 5.3+):

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

E per PHP 7:

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

Bingo, questo è il modo giusto per farlo a partire dal 5.3 –

+0

La soluzione più bella, thx ... Non sapeva in questo modo ;-) – algorhythm

+1

Questo genererà un avviso per le variabili che non sono impostate – billyonecan

6

Poiché entrambi gli or e || non restituiscono uno dei loro operandi che non è possibile.

si potrebbe scrivere una semplice funzione per questo però:

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

Sì, ho pensato che sarebbe stato il mio altro modo, speravo che esistesse un modo ancora più breve di eseguire. –

+1

Il modo più semplice sarebbe cambiare ad es. to python: p – ThiefMaster

+0

Penso che il passaggio di var inesistenti a questa funzione provocherebbe un errore. – pie6k

16
Ci

è un one-liner per questo, ma non è esattamente breve:

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

array_filter restituirebbe tutti voi non voci nulle dalla lista di alternative. E current ottiene solo la prima voce dall'elenco filtrato.

+0

Questo è perfetto; Direi che questo è il quasi equivalente di quello che stavo cercando. Grazie Mario! –

+0

+1 per one-Liners –

+1

Runtimewise, questo finirà per enumerare tutti i valori, nulli o no, giusto? L'esempio JS si sarebbe fermato al primo valore non nullo. –

1

Questa sintassi equivale a 1 se uno di questi è impostato e non falso, e 0 se non lo è.

Ecco un modo una linea di fare questo, che funziona e che può essere estesa per qualsiasi numero di opzioni:

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

... abbastanza brutto però. Modifica: Mario's è migliore del mio poiché rispetta il tuo ordine arbitrario scelto come questo, ma a differenza di questo, non continua a diventare più brutto con ogni nuova opzione che aggiungi.

+0

Ma la tua opzione tiene conto della chiave associativa mancante che genererebbe altrimenti un errore php. – Manatax

1

È possibile provare

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

Perché la varietà è il sale della vita:

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

Dal PHP 7, è possibile utilizzare il null coalescing operator:

L'operatore nullo coalescenza (??) è stato aggiunto come zucchero sintattico per il caso comune di dover utilizzare un ternario congiuntamente con isset(). Restituisce il suo primo operando se esiste e non è NULL; altrimenti restituisce il suo secondo 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'; 
+0

Ora non ci resta che attendere i repository di produzione colpiti da PHP 7, super eccitati all'utilizzo. –

+0

Questo non funzionerebbe per la domanda come richiesto a meno che non tutti i campi esistano anche perché non tratterà le stringhe nulle (restituite se un campo è vuoto) come NULL. –

4

Sulla risposta di Adam, è possibile utilizzare l'operatore di controllo degli errori per contribuire a sopprimere gli errori generati quando le variabili non sono impostate.

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

http://php.net/manual/en/language.operators.errorcontrol.php

Problemi correlati