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

No entiendo el último fragmento de este código "? $_POST['items'] : array();"¿Qué hace? ...: ... ¿hacer?

¿Qué esa combinación de código hacen exactamente?

Lo uso para tomar un grupo de valores de cuadros de texto html y almacenarlos en una matriz de sesión. Pero el problema es que, si intento volver a enviar los datos en cuadros de texto, la nueva sesión de matriz sobrescribe la matriz de sesiones anterior con espacios completamente en blanco y todo.

Solo quiero sobrescribir los lugares en la matriz que ya tienen valores. Si el usuario decide completar solo algunos cuadros de texto, no quiero que los datos de la matriz de sesión anterior se sobrescriban con espacios en blanco (de los cuadros de texto en blanco).

Estoy pensando que el código anterior es el problema, pero no estoy seguro de cómo funciona. Ilumíname por favor.

Respuesta

38

Esto es unternary operator:

La expresión (expr1) ? (expr2) : (expr3) evalúa a expr2 si expr1 evalúa a TRUE, y expr3 si expr1 evalúa a FALSE.

+0

Es * A * operador ternario y no el operador ternario Al igual que hay muchos opreators binarios (+, -., *, /, &&, || , ^, etc.). – Gumbo

+0

La documentación de PHP lo llamó 'el': X –

+1

se suele llamar oficialmente el "operador condicional" en la mayoría de los idiomas, pero a menudo también se lo llama * el * operador ternario porque en la mayoría de los idiomas es el único operador ternario. Bien puede ser que cuando se creó PHP, eligieron "el operador ternario" como el nombre oficial, pero no estoy seguro. – rmeador

17

Esa última parte se conoce como operador condicional. Básicamente es una declaración condensada if/else.

funciona así:

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

También aquí es un poco de pseudo-código puede ser más simple:

$items = (condition) ? value_if_condition_true : value_if_condition_false; 

Editar: Aquí es un rápido, pedante lado- Nota: La documentación de PHP llama a este operador un operador ternario . Mientras que el operador condicional es técnicamente un operador ternario (es decir, un operador con 3 operandos) es un nombre inapropiado (y más bien presuntivo) llamarlo el operador ternario.

+0

esto es más comprensible que la respuesta aceptada – Gokigooooks

0

Básicamente, si $ _POST ['items'] existe, entonces $ items se establece en él, de lo contrario se establece en una matriz vacía.

+0

es posible almacenar solo elementos específicos de la matriz de elementos o tiene que sobrescribir el Toda la matriz? – payling

0

Es un operador ternario que dice esencialmente si la clave de elementos está en $ _POST luego establece $ items para igualar el valor de $ _POST ['items'] sino que lo establece en una matriz nula.

1

Es lo mismo que:

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

mirada a la respuesta de Paolo entender el operador ternario.

Para hacer lo que está buscando hacer, es posible que desee utilizar una variable de sesión.

En la parte superior de la página, escriba esto (porque no puede enviar nada a la página antes de iniciar una sesión. I.E.NO HAY DECLARACIONES DE ECHO)

session_start(); 

Luego, cuando un usuario envía su formulario, guarde el resultado en esta variable del servidor. Si esta es la primera vez que el usuario envía el formulario, simplemente guárdelo directamente, de lo contrario recorra y agregue cualquier valor que no esté vacío. A ver si esto es lo que busca:

código 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> 

código de procesamiento (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

pensé que también digno de mención que ?: es un operador independiente, donde:

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

es la abreviatura de:

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

Aparte de escribir menos, la ventaja de tiempo de ejecución es que, si se utiliza una función como two(), la función sólo sería evaluada una vez usando la forma abreviada, pero posiblemente dos veces utilizando la forma larga.

0

yup ... es operador ternario

una explicación simple y claro siempre y here, en el que el autor dijo que es como si respondiera: “Bueno, ¿es verdad”

la colonsepara dos valores posibles (o). el primer valor se elegirá si la expresión de prueba es verdadera. el segundo (detrás del colon) se elegirá si las primeras respuestas son falsas.

operador ternario muy útil en la creación de variables en php 7.x, sin aviso previo. Por ejemplo"

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

En lugar de enlazar con el sitio, incluya un breve resumen del contenido de las páginas. Si cambian la ubicación de las páginas más adelante, esta respuesta no será muy útil. – davelupt

+0

davelupt, gracias por su sugerencia de "resumen breve". lo agregué. – Cholis