2011-11-20 15 views
23

什麼是以下(總部設在JS風格)在PHP相當於:使用短路拿到第一個非空變量

echo $post['story'] || $post['message'] || $post['name']; 

所以,如果存在的故事,然後張貼;或者如果消息存在後,等等...

+1

什麼在這樣的運營商呢?你不知道你想輸出的某個變量嗎? –

+1

只需要2個參數就可以使用:'echo isset($ _ POST ['story'])? $ _POST ['story']:$ _POST ['message'];',最終嘗試嵌套它。 – mj82

+1

它基於facebook api流;每個職位只有三分之一存在。 –

回答

37

這將是(PHP 5.3+)

echo $post['story'] ?: $post['message'] ?: $post['name']; 

而對於PHP 7

echo $post['story'] ?? $post['message'] ?? $post['name']; 
+3

賓果,這是正確的方式做它從5.3 –

+0

最好的解決方案,thx ...不知道這種方式;-) – algorhythm

+1

這將產生一個未設置變量的警告 – billyonecan

6

由於or||都不返回它們不可能的操作數之一。

你可以儘管寫一個簡單的功能吧:

function firstset() { 
    $args = func_get_args(); 
    foreach($args as $arg) { 
     if($arg) return $arg; 
    } 
    return $args[-1]; 
} 
+0

是的,我想這將是我的另一種方式,我希望有一個更短的執行方式。 –

+1

最簡單的方法是切換例如到python:p – ThiefMaster

+0

我認爲將不存在的var傳遞給這個函數會導致錯誤。 – pie6k

16

有一個班輪爲,但它不完全短:

echo current(array_filter(array($post['story'], $post['message'], $post['name']))); 

array_filter將返回你所有的非空白條目從替代品列表中。而current只是從過濾列表中獲取第一個條目。

+0

這是完美的;我會說這與我正在尋找的東西幾乎相當。謝謝馬里奧! –

+0

+1對於單行 –

+1

運行時,這將結束枚舉所有值,null或不是,對吧? JS示例將停止在第一個非空值。 –

1

如果設置了這些語法中的任何一個而不是false,則語法會回顯1,如果不是,則返回0。

這裏是做這其中工程並可以擴展到任意數量的選項的單行道:

echo isset($post['story']) ? $post['story'] : isset($post['message']) ? $post['message'] : $post['name']; 

...很醜陋,但。編輯:馬里奧的比我的要好,因爲它尊重你所選擇的任意順序,但不像這樣,它不會隨着你添加的每個新選項而變得越來越醜。

+0

但是,您的選擇會導致丟失關聯關鍵字,否則會生成php錯誤。 – Manatax

1

,您可以嘗試

<?php 
    echo array_shift(array_values(array_filter($post))); 
?> 
1

因爲品種是生活的調味品:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name'))); 
4

作爲PHP 7的,則可以使用null coalescing operator

空合併算子(??)已經被添加作爲語法糖 於需要結合使用的三元的常見的情況與 isset()。它返回它的第一個操作數,如果它存在並且不是NULL; 否則返回第二個操作數。

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
+0

現在我們只需要等待PHP 7命中產品回購,超級興奮使用這個。 –

+0

對於所問的問題,這將不起作用,除非並非所有字段都存在,因爲它不會將空字符串(如果字段爲空則返回)作爲NULL處理。 –