2009-05-20 109 views
16
$items = (isset($_POST['items'])) ? $_POST['items'] : array(); 

我不明白这个代码的最后片段“? $_POST['items'] : array();什么? ...:...呢?

是什么的代码组合做什么呢?

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

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

我在想上面的代码是问题,但我不知道它是如何工作的。请赐教。

回答

38

这是一个ternary operator

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

+0

更容易理解它是* A *三元运算符,而不是三元运算符正如有许多二进制opreators(+, - ,*,/,&&,|| ,^等) – Gumbo 2009-05-20 18:19:47

+0

的PHP文件把它称为“的”:X – 2009-05-20 18:26:41

+1

它通常被称为“有条件的经营者”正式在大多数语言中,但也经常被称为*的*三元运算符,因为在大多数语言中,它是只有三元运营商。这可能是所创建PHP的时候,他们选择了“三元运算符”为正式名称,但我不知道。 – rmeador 2009-05-20 18:59:49

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个操作数的运算符),但将其称为三元运算符是错误的(并且是假定的)。

+0

这比接受的答案 – Gokigooooks 2015-10-11 04:45:32

0

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

0

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

1

这是一样的:

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

看看保罗的回答,了解三元运算符。

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

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

我想这也是值得注意即?:是一个单独的运算符,其中:

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

是简写:

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

除了打字少,运行时间的优点是,如果使用像two()一个函数,该函数只使用一次的简写形式评价,但有可能使用两倍长形式。

0

烨...这是三元运算符

一个简单而明确的解释提供here,其中对笔者说这就像回答:“嗯,是真的”

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

三元运营商在PHP创建7.x的变量非常有益的,免费的通知警告。例如,”

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