有啥作用? ... : ... 做? [复制]
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中的操作符是做啥的? [复制]