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

Я не понимаю, последний фрагмент этого кода «? $_POST['items'] : array();»Что делает? ... : ... делать?

Что это комбинация кода делать именно?

Я использую его, чтобы взять кучу значений из текстовых полей html и сохранить их в массиве сеансов. Но проблема в том, что если я попытаюсь повторно отправить данные в текстовые поля, новый сеанс массива перезапишет старый массив сеансов полностью пустыми и все.

Я только хочу переписать места в массиве, который уже имеет значения. Если пользователь решает заполнить только несколько текстовых полей, я не хочу, чтобы предыдущие данные массива сеансов были перезаписаны пустым пространством (из пустых текстовых полей).

Я думаю, что вышеуказанный код является проблемой, но я не уверен, как это работает. Просветите меня, пожалуйста.

ответ

38

Это ternary operator:

Выражение (expr1) ? (expr2) : (expr3) вычисляется в expr2, если expr1 вычисляется в TRUE и expr3, если expr1 вычисляется в FALSE.

+0

Это * A * тройная оператор, а не тройной оператор Так же, как существует множество двоичных opreators (+, -., *, /, &&, || ,^и т. д.). – Gumbo

+0

Документация PHP, называемая «the»: X –

+1

, обычно называется «условным оператором» официально на большинстве языков, но часто также называется * * тернарным оператором, потому что в большинстве языков это возможно, только тогда, когда PHP был создан, они выбрали «тернарный оператор» в качестве официального имени, но я не уверен. – rmeador

17

Эта последняя часть называется условный оператор. В основном это сжатый оператор if/else.

Это работает так:

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

Также здесь есть некоторые псевдо-код, который может быть проще:

$items = (condition) ? value_if_condition_true : value_if_condition_false; 

Edit: Вот быстрый, педантичный бок- Примечание. Документация PHP вызывает этот оператор: тернарный оператор. В то время как условный оператор технически является тройным оператором (т. Е. Оператором с 3 операндами), является неправильным (и скорее предположительным) его называть тернарный оператор.

+0

это более понятно, чем принято отвечать – Gokigooooks

0

В принципе, если $ _POST ['items'] существует, тогда $ items устанавливается в него, иначе он получает значение в пустой массив.

+0

можно хранить только определенные элементы из массива элементов или перезаписывать весь массив? – payling

0

Это тройной оператор, который по существу говорит, что если ключ элементов находится в $ _POST, тогда установите $ items равным значению $ _POST ['items'], иначе установите его в нулевой массив.

1

Это то же самое, как:

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

Посмотрите на ответ Паоло, чтобы понять тройной оператор.

Чтобы сделать то, что вы ищете, вы можете использовать переменную сеанса.

В верхней части страницы укажите это (потому что вы не можете выводить ничего на страницу перед началом сеанса.НЕТ ЗАЯВЛЕНИЙ ECHO)

session_start(); 

Затем, когда пользователь отправляет вашу форму, сохраните результат в этой переменной сервера. Если это первый раз, когда пользователь отправил форму, просто сохраните ее напрямую, иначе выполните цикл и добавьте любое значение, которое не является пустым. Смотрите, если это то, что вы ищете:

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> 

обработки кода (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

Я полагал, что это также стоит отметить, что ?: отдельный оператор, где:

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

представляет собой сокращенный:

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

Помимо набрав менее, преимущество выполнения является то, что при использовании функции, как two(), функция будет оцениваться только один раз, используя сокращенную форму, но, возможно, в два раза, используя длинную форму.

0

... да это троичный оператор

простое и ясное объяснение при условии here, в котором автор сказал, что это, как отвечать: «Ну, это правда»

двоеточиеразделяет две возможные значения (или). первое значение будет выбрано, если тестовое выражение истинно. вторая (за двоеточием) будет выбрана, если первые ответы будут ложными.

тернарный оператор очень полезен при создании переменной в php 7.x, без предупреждения. Например»

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

Вместо того, чтобы ссылаться на сайт, пожалуйста, укажите краткую сводку содержимого страниц. Если они изменят расположение страниц позже, этот ответ не будет очень полезен. – davelupt

+0

davelupt, спасибо за предложение «краткое резюме». Я добавил. – Cholis