什么......:......呢?

时间:2009-05-20 18:04:38

标签: php syntax ternary-operator

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

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

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

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

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

我认为上面的代码是问题,但我不确定它是如何工作的。请赐教。

8 个答案:

答案 0 :(得分:41)

这是 a ternary operator

如果(expr1) ? (expr2) : (expr3)评估为expr2,则expr1表达式评估为TRUE;如果expr3评估为expr1,则表达式FALSE

答案 1 :(得分: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;

编辑:这是一个快速,迂腐的旁注:PHP文档将此运算符称为三元运算符。虽然条件运算符在技术上是三元运算符(即具有3个操作数的运算符),但将其称为 三元运算符是一种误称(而非推定)。 / p>

答案 2 :(得分:2)

看看保罗的理解三元运算符的答案。

要做你正在做的事情,你可能想要使用会话变量。

在页面顶部放置此内容(因为在开始会话之前无法向页面输出任何内容.I。E。NO ECHO语句)

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

答案 3 :(得分:1)

与以下内容相同:

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

答案 4 :(得分:0)

是的......这是三元运营商

提供了一个简单明了的解释here,其中作者说它就像回答:“嗯,这是真的吗?”

冒号 分隔两个可能的值(或)。如果测试表达式为真,则将选择第一个值。如果第一个答案是假的话,将选择第二个(冒号后面)。

三元运算符在php 7.x中创建变量非常有帮助,没有通知警告。例如&#34;

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

是:

的简写
$one = $two ? $two : $three;
$one = two() ? two() : three();

除了输入less之外,运行时的优势在于,如果使用类似two()的函数,该函数只能使用缩写形式计算一次,但可能只使用long形式计算两次。