Что значит ? … : … делать?

$items = (isset($_POST['items'])) ? $_POST['items'] : array(); 

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

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

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

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

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

Solutions Collecting From Web of "Что значит ? … : … делать?"

Это тернарный оператор :

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

Эта последняя часть называется условным оператором . В основном это сжатое выражение 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; 

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

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

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

В верхней части страницы поставьте это (потому что вы не можете выводить ничего на страницу перед началом сеанса. IE NO ECHO STATEMENTS)

 session_start(); 

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

HTML CODE (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>'; } ?> 

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

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

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

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

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

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

сокращается для:

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

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

yup … это тройной оператор

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

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

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

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