Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

В верхней части страницы поставьте это (потому что вы не можете выводить что-либо на страницу перед началом сеанса. I.E. 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>';
}
?>

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

является сокращением для:

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

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

Ответ 8

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

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

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

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

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