2012-06-24 106 views
0

有沒有更高效,更清潔和更短的形式如下:多空檢查

if($x==null or $y==null or $z==null or $w==null) return true; 

一般怎麼我也得空變量的名字嗎?

function any_null(array $a){ 
    foreach($a as $v) if ($v==null) return //variable name; 
    return false; 
} 
var_dump(any_null(array($x,$y,$z,$w))); 

回答

9

isset可以採取多個參數。

如果提供了多個參數,則只有在設置了所有參數後,isset()纔會返回TRUE 。

因爲這是你想要的,需要的簡單否定的正好相反:

!isset($x, $y, $z, $w) 

另外一個好處是,isset不是常規功能,並不會提高對不確定的變量的任何通知。


很難從變量中獲取名稱。您需要以某種方式檢查其中的每一個。我認爲最好的和最可擴展的解決方案是使用一個關聯數組的變量名作爲關鍵字:

function any_null(array $a){ 
    foreach($a as $k => $v) if ($v === null) return $k; 
    return false; 
} 
any_null(array('x' => $x, 'y' => $y)); 

注意嚴格比較(===)。否則,false,"",0array()也將被計爲「空」。

另一種解決方法是隻給傳遞你的變量的名字並利用$GLOBALS數組。在這裏,我一起func_get_args呼叫加上它變得有點不那麼冗長的調用約定:

function any_null(){ 
    $a = func_get_args(); 
    foreach($a as $k) if (!isset($GLOBALS[$k])) return $k; 
    return false; 
} 
any_null('x', 'y', 'z'); 

這最後的解決方案有很多缺點,但。您只能測試全局範圍內的變量,並且只能測試標準變量(不是數組中的元素,而不是對象等)。這些語法會非常笨重。

+0

@謝謝,它也更有效率嗎? – PHPst

+1

我不認爲你應該擔心效率。這顯然是過早的微觀優化。但是,如果您確實需要知道:是的,isset是一種語言結構,是PHP語言本身的一部分,而不是函數。它的實施水平很低。 –