2015-02-07 73 views
6

我一直在尋找和測試一段時間,只是無法找到我正在努力完成的方式是否可能。關聯數組中的PHP三元語句設置鍵和值?

我想基於三元語句在定義數組時添加一個鍵/值對。

Array(
    'Item 1' => 'Some value', 
    (FALSE)? NULL : 'Item 2' => 'Another Value' 
) 

我的預期/希望的行爲是結果則是:

Array (
    [Item 1] => Some value 
    [Item 2] => Another Value 
) 

而當說法是正確的:

Array(
    'Item 1' => 'Some value', 
    (TRUE)? NULL : 'Item 2' => 'Another Value' 
) 

產量:

Array (
    [Item 1] => Some value 
) 

但是,我得到:

Array (
    [Item 1] => Some value 
    [] => Another Value 
) 

這會導致問題,因爲A)我不希望這第二個元素存在於第一個位置和B)False條件值分配給True條件值(在這種情況下NULL,它設置鍵爲NULL [])

這是非常奇特的。我唯一的選擇是擁有一個標準的if(){}語句,並且如果條件爲假(通過使用!)將數組元素彈出到數組中?

注意:爲項目2設置一個空值是不可接受的,而如果初始條件爲true,則根本不應存在任何元素。

任何幫助將不勝感激!

+1

99%肯定這是不可能的,即你需要使用'if'。我會多考慮一下,看看我能否做得更好。 – Austin 2015-02-07 04:34:19

+0

這是不可能的。要麼你添加一個元素到一個數組或者你沒有;沒有辦法像這樣有條件地做到這一點。無論如何,使用'if'語句的問題究竟是什麼......?它完美地完成了這項工作(有人甚至會說它比三元組更直觀)。 – 2015-02-07 05:08:02

+0

它實際上[可能](http://stackoverflow.com/a/29327671/367456),但你通常不想這樣做。/cc @Austin – hakre 2015-03-29 09:48:34

回答

7

你對這個三元運算符所做的一切就是決定鍵名。元素將被放入數組中,無論如何,它就在數組文字聲明中。

您可以用內嵌式做的最好的是這樣的:

['foo' => 'bar'] + (true ? [] : ['baz' => 42]) 

實際上,你應該更好地寫:

$arr = ['foo' => 'bar']; 
if (true) { 
    $arr['baz'] = 42; 
} 

編寫更緊湊的代碼並不總是最佳進球首先,它需要可讀性和可理解性。

+0

因爲這是在php-5.3下標記的,所以最好不要使用僅在5.4+中可用的短陣列語法。但答案仍然正確。 – imkingdavid 2015-02-09 07:48:19

+0

謝謝,我用第二種方法去了,代碼仍然乾淨地閱讀! – thatnetworkguy 2015-03-10 02:32:28

+0

「不管是什麼」是這裏的關鍵。你可以讓它失敗:http://stackoverflow.com/a/29327671/367456 :) – hakre 2015-03-29 09:46:05

0

只有通過使語句無效纔可能。

例如,您爲PHP無法處理的密鑰(例如數組)添加一個值,並且每當您不想添加條目時,都使用該密鑰。

原理實際上類似於一個你有什麼用NULL值大綱:

Array(
    'Item 1' => 'Some value', 
    TRUE ? array() : 'Item 2' => 'Another Value' 
) 

這種方法的缺點是該代碼是笨重的,不清晰閱讀並給出警告:

警告:非法偏移類型

因此,我添加此答案更爲完整。

完整的示例(online demo):

<?php 
/** 
* PHP Ternary statement within Associative Array to set both key & value? 
* @link http://stackoverflow.com/a/29327671/367456 
*/ 

var_dump(
    Array(
     'Item 1'     => 'Some value', 
     TRUE ? array() : 'Item 2' => 'Another Value', 
     FALSE ? array() : 'Item 3' => 'Just Another Value', 
    ) 
); 
+2

這實際上是相當了不起的,即使你永遠不應該這樣做。 – Austin 2015-03-29 09:59:45