2013-07-10 28 views
2

我有兩個函數a()b(),兩者都返回一個布爾值。我知道邏輯表達式的求值只要知道結果就會停止,但是有沒有辦法對兩個或多個函數執行邏輯運算,使得兩個函數都能執行?執行邏輯運算中的所有功能

回答

2

根據this comment on the PHP manual

評估的邏輯表達式是隻要結果被稱爲停止。 如果你不想要這個,你可以用min()和or(或)運算符替換max和()。

所以這個代碼可能是你有幫助,你可以看到所有函數被調用在每種情況下,是的,你可以使用這個有兩個以上的功能: -

function a() 
{ 
    echo "function a<br/>\n"; 
    return true; 
} 
function b() 
{ 
    echo "function b<br/>\n"; 
    return false; 
} 

function c() 
{ 
    echo "function c<br/>\n"; 
    return false; 
} 

echo min(a(), b(), c()); 
echo "<br/>"; 
echo max(a(), b(), c()); 
echo "<br/>"; 

輸出: -

function a 
function b 
function c 
(false)  
function a 
function b 
function c 
(true) 

Demo

+0

這是非常漂亮的解決方案! :) –

-3

你的意思是像下面這樣的東西?

var bothTrue; 

if(a() && b()) { 
    bothTrue = true; 
} 
else { 
    bothTrue = false; 
} 

或者你是什麼意思,具體由「替代」?

+0

這可以寫成一行'VAR bothTrue = A() && b();'爲了提高可讀性,同樣,這個答案並沒有提到所有似乎是這個問題的主要問題的懶惰操作。 –

0

如果要求兩個函數都應該執行,那麼用單個語句來保證這種行爲是不可能的。起初,你可能會認爲可以使用連詞或分詞,但是這兩種構造都是懶惰這意味着只要知道它們是真的(對於分離)或假(對於連接)它們就會停止評估, 。

function a() { 
    print("A"); 
    return true; 
} 

function b() { 
    print("B"); 
    return false; 
} 

$disjunction = a() || b(); // prints A, not B 
$conjunction = b() && a(); // prints B, not A 

上面的代碼將只輸出AB,而不是ABBA正如您所料。這是因爲當一個值爲真時,析取總是成立的,而當一個值爲假時,連接總是假。

加成

如果這種行爲確實需要的是某種原因,PHP功能,如mapreducefilter可以使用評估幾種陳述,並與一個布爾答案告終。雖然這會要求您創建額外的功能來支持評估(可以與create_function函數一起使用),並且不會像使用多行那樣可讀,而且如果要實現這一點,則很難進行調試。

+0

就是如此。所以除了在單獨的表達式中調用每一個函數,獲取它們的返回值然後進行析取之外別無他法。這真的很傷心 –

+0

@BlaskPoranka,我已經添加了一些關於如何強制執行此行爲的附加說明,但除非由於某些動態構造或基於用戶輸入的評估而需要此行爲,否則我真的會反對。 –

+0

是的,我在做'!array_filter(array(a(),b(),c()))',但我不喜歡它。請參閱@vascowhite回答這是非常優雅:) –

2

根據你所需要的,這可能可能(以下@JakobPogulis的回答):

PHP:

function a() { 
    print("A"); 
    return true; 
} 

function b() { 
    print("B"); 
    return false; 
} 
var_dump((boolean)(intval(a()) | intval(b()))); 
var_dump((boolean)(intval(a()) & intval(b()))); 

Online demo

的JavaScript:

function a() 
{ 
    console.log("A"); 
    return true; 
} 
function b() 
{ 
    console.log("B"); 
    return false; 
} 
console.log(Boolean(Number(a()) & Number(b()))); 
console.log(Boolean(Number(a()) | Number(b()))); 

Online demo

+1

你應該展開爲什麼它只有「可能」是可能的。在什麼情況下是不可能的? – mash

+0

@Mash我不知道,我不太確定這是OP想要什麼(問題已關閉並編輯並重新打開)。 – Passerby