2009-05-20 106 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'] : "";