2009-05-20 6 views
16
$items = (isset($_POST['items'])) ? $_POST['items'] : array(); 

Non capisco l'ultimo frammento di questo codice "? $_POST['items'] : array();"Cosa fa? ... : ... fare?

Che cosa combinazione di codice fanno esattamente?

Lo uso per raccogliere un sacco di valori dalle caselle di testo html e memorizzarlo in un array di sessione. Ma il problema è che se tento di inviare nuovamente i dati nelle caselle di testo, la nuova sessione dell'array sovrascrive il vecchio array di sessione completamente spazi vuoti e tutto il resto.

Voglio solo sovrascrivere i posti nella matrice che hanno già valori. Se l'utente decide di compilare solo alcune caselle di testo, non voglio che i precedenti dati della sessione vengano sovrascritti da spazi vuoti (dalle caselle di testo vuote).

Sto pensando che il codice sopra sia il problema, ma non sono sicuro di come funzioni. Illuminami per favore.

risposta

38

Questo è un ternary operator:

L'espressione (expr1) ? (expr2) : (expr3) viene valutato come expr2 se expr1 viene valutato come TRUE e expr3 se expr1 viene valutato come FALSE.

+0

E '* Un operatore * ternario e non l'operatore ternario Così come ci sono molti opreators binari (+, -., *, /, &&, || , ^, ecc.) – Gumbo

+0

La documentazione PHP lo chiamava "the": X –

+1

è solitamente chiamato "operatore condizionale" ufficialmente nella maggior parte delle lingue, ma viene spesso chiamato anche * l'operatore ternario perché nella maggior parte delle lingue, è il Solo operatore ternario, potrebbe essere che quando PHP è stato creato, hanno scelto "l'operatore ternario" come nome ufficiale, ma non ne sono sicuro. – rmeador

17

L'ultima parte è nota come operatore condizionale. Fondamentalmente si tratta di una dichiarazione condensata if/else.

funziona così:

$items = 
    // if this expression is true 
    (isset($_POST['items'])) 
    // then "$_POST['items']" is assigned to $items 
    ? $_POST['items'] 
    // else "array()" is assigned 
    : array(); 

Anche qui è una certa pseudo-codice che potrebbe essere più semplice:

$items = (condition) ? value_if_condition_true : value_if_condition_false; 

Edit: Ecco una rapida, lato- saccente nota: la documentazione PHP chiama questo operatore un operatore ternario . Mentre l'operatore condizionale è tecnicamente un operatore ternario (cioè un operatore con 3 operandi) è un termine improprio (e piuttosto presuntivo) chiamarlo l'operatore ternario.

+0

questo è più comprensibile che la risposta accettata – Gokigooooks

0

Fondamentalmente se $ _POST ['items'] esiste allora $ items viene impostato altrimenti viene impostato su un array vuoto.

+0

è possibile archiviare solo elementi specifici dall'array dell'articolo o deve sovrascrivere l'elemento intero array? – payling

0

È un operatore ternario che dice essenzialmente se la chiave items è in $ _POST, quindi imposta $ items per uguagliare il valore di $ _POST ['items'] altrimenti lo imposta su un array nullo.

1

E 'lo stesso di:

if (isset($_POST['items']){ 
    $items = $_POST['items']; 
} else { 
    $items = array(); 
} 
2

Guardate la risposta di Paolo per capire l'operatore ternario.

Per fare ciò che si sta guardando si potrebbe voler utilizzare una variabile di sessione.

Nella parte superiore della pagina inserisci questo (perché non è possibile stampare nulla sulla pagina prima di iniziare una sessione.NESSUN RILASCIO ECHO)

session_start(); 

Quindi, quando un utente invia il modulo, salva il risultato in questa variabile del server. Se è la prima volta che l'utente invia il modulo, è sufficiente salvarlo direttamente, altrimenti scorrere e aggiungere qualsiasi valore che non sia vuoto. Vedere se questo è quello che stai cercando:

CODICE HTML (testform.html):

<html> 
    <body> 
    <form name="someForm" action="process.php" method="POST"> 
     <input name="items[]" type="text"> 
     <input name="items[]" type="text"> 
     <input name="items[]" type="text"> 
     <input type="submit"> 
    </form> 
    </body> 
</html> 

codice Processing (process.php):

<?php 
session_start(); 

if(!$_SESSION['items']) { 
    // If this is the first time the user submitted the form, 
    // set what they put in to the master list which is $_SESSION['items']. 
    $_SESSION['items'] = $_POST['items']; 
} 
else { 
    // If the user has submitted items before... 
    // Then we want to replace any fields they changed with the changed value 
    // and leave the blank ones with what they previously gave us. 
    foreach ($_POST['items'] as $key => $value) { 
     if ($value != '') { // So long as the field is not blank 
      $_SESSION['items'][$key] = $value; 
     } 
    } 
} 


// Displaying the array. 
foreach ($_SESSION['items'] as $k => $v) { 
    echo $v,'<br>'; 
} 
?> 
0

ho pensato che anche la pena notare che è ?: operatore separata, dove:

$one = $two ?: $three; 
$one = two() ?: three(); 

è un'abbreviazione per:

$one = $two ? $two : $three; 
$one = two() ? two() : three(); 

parte digitando meno, il vantaggio runtime è che, se si utilizza una funzione come two(), la funzione verrà valutata solo una volta utilizzando il modulo abbreviata, ma possibilmente due volte utilizzando il modulo lungo.

0

Yup ... è operatore ternario

una spiegazione semplice e chiara fornito here, in cui l'autore ha detto che è come rispondere: “Beh, è ​​vero”

la due puntisepara due valori possibili (o). il primo valore sarà scelto se l'espressione test è vera. il secondo (dietro i due punti) sarà scelto se le prime risposte sono false.

operatore ternario molto utile nella creazione di variabili in php 7.x, senza preavviso. Ad esempio,"

$mod = isset($_REQUEST['mod']) ? $_REQUEST['mod'] : ""; 
+0

Invece di collegarsi al sito, si prega di includere un breve riassunto dei contenuti della pagina Se cambiano la posizione delle pagine più tardi, questa risposta non sarà molto utile – davelupt

+0

davelupt, grazie per il suggerimento "il breve riassunto". l'ho aggiunto – Cholis