有啥作用? ... : ... 做? [复制]

Posted

技术标签:

【中文标题】有啥作用? ... : ... 做? [复制]【英文标题】:What does ? ... : ... do? [duplicate]有什么作用? ... : ... 做? [复制] 【发布时间】:2010-10-27 17:23:30 【问题描述】:
$items = (isset($_POST['items'])) ? $_POST['items'] : array();

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

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

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

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

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

【问题讨论】:

【参考方案1】:

这是一个 ternary operator:

如果expr1 的计算结果为TRUE,则表达式(expr1) ? (expr2) : (expr3) 的计算结果为expr2,如果expr1 的计算结果为FALSE,则表达式expr3

【讨论】:

这是 A 三元运算符,而不是三元运算符。正如有许多二元运算符(+、-、*、/、&&、||、^ 等)。 它通常在大多数语言中正式称为“条件运算符”,但通常也称为 the 三元运算符,因为在大多数语言中,它是唯一的三元运算符。很可能是 php 在创建时,他们选择了“三元运算符”作为正式名称,但我不确定。 修正了我的答案,以反映对使用“the”的意外骚动 来自同一个链接,“从 PHP 5.3 开始,可以省略三元运算符的中间部分。表达式 expr1 ?:如果 expr1 计算结果为 TRUE,则 expr3 返回 expr1,否则返回 expr3。” PHP 中的三元运算符不止一个,Gumbo?【参考方案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 个操作数的运算符),但将其称为 the 三元运算符是一种误称(而且相当推定)。

【讨论】:

这比接受的答案更容易理解【参考方案3】:

看看 Paolo 的回答就可以理解三元运算符了。

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

在页面顶部放置这个(因为在开始会话之前您无法向页面输出任何内容。即没有 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>';

?>

【讨论】:

【参考方案4】:

同理:

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

【讨论】:

【参考方案5】:

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

【讨论】:

是否可以仅存储项目数组中的特定项目,还是必须覆盖整个数组?【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

是以下的简写:

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

除了输入更少之外,运行时的优势在于,如果使用像 two() 这样的函数,该函数只会使用简写形式计算一次,但使用长形式可能会计算两次。

【讨论】:

【参考方案8】:

是的...它是三元运算符

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

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

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

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

【讨论】:

请附上页面内容的简短摘要,而不是链接到网站。如果他们稍后更改页面位置,则此答案不会很有帮助。 davelupt,感谢“简要总结”的建议。我加了。

以上是关于有啥作用? ... : ... 做? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

日期前的“+”有啥作用? [复制]

用“+”运算符为对象添加前缀有啥作用? [复制]

在 Javascript 中使用多个 = 运算符有啥作用? [复制]

有啥作用?。和 ?? javascript中的操作符是做啥的? [复制]

cmpl $0x1, -0x18(ebp) 在 AT&T 中有啥作用? [复制]

$1 和 $* 有啥作用? [复制]