Вопрос

На этот вопрос уже есть ответ здесь:

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Вверху вашей страницы поместите это (потому что вы не можете ничего вывести на страницу до начала сеанса.Т.Е.НИКАКИХ ЭХО-ЗАЯВЛЕНИЙ)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$mod = isset($_REQUEST['mod']) ? $_REQUEST['mod'] : "";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top