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

我不明白这段代码的最后一段“ ? $_POST['items'] : array();

这种代码组合究竟做了什么?

我使用它从 html 文本框中获取一堆值并将其存储到会话数组中。但问题是,如果我尝试重新提交文本框中的数据,新的数组会话会覆盖旧的会话数组,完全空白。

我只想覆盖数组中已经有值的地方。如果用户决定只填写几个文本框,我不希望之前的会话数组数据被空格覆盖(来自空白文本框)。

我认为上面的代码是问题所在,但我不确定它是如何工作的。请启发我。

4

8 回答 8

45

这是一个 三元运算符

表达式的(expr1) ? (expr2) : (expr3) 计算结果为expr2ifexpr1计算结果为TRUE,并且expr3ifexpr1计算结果为FALSE

于 2009-05-20T18:05:58.877 回答
18

最后一部分称为条件运算符。基本上它是一个浓缩的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 个操作数的运算符),但将其称为三元运算符是用词不当(而且相当推定

于 2009-05-20T18:05:46.523 回答
2

它与以下内容相同:

if (isset($_POST['items']){
    $items = $_POST['items'];
} else {
    $items = array();
}
于 2009-05-20T18:09:39.947 回答
2

查看 Paolo 的答案以了解三元运算符。

要执行您正在做的事情,您可能需要使用会话变量。

在页面顶部放置这个(因为在开始会话之前您无法向页面输出任何内容。IE NO ECHO STATEMENTS)

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>';
}
?>
于 2009-05-21T17:31:41.127 回答
1
于 2017-09-16T06:20:29.367 回答
0

基本上,如果 $_POST['items'] 存在,则 $items 被设置为它,否则它被设置为一个空数组。

于 2009-05-20T18:06:22.543 回答
0

它是一个三元运算符,本质上说如果 items 键在 $_POST 中,则将 $items 设置为等于 $_POST['items'] 的值,否则将其设置为空数组。

于 2009-05-20T18:08:41.603 回答
0

我认为还值得注意的是,它?:是一个单独的运算符,其中:

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

是以下的简写:

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

除了键入更少之外,运行时的优势在于,如果使用类似 的函数two(),则该函数将仅使用简写形式计算一次,但使用长形式可能会计算两次。

于 2016-06-06T18:11:57.183 回答