2017-08-16 25 views
1

我搜索了很多,除了寫更大的代碼之外,找不到任何解決方案。 我需要的是,只有在設置了兩個$ btn_字符串之一時才輸出。PHP沒有處理OR中的第二個條件

在當前的狀態,如果$btn_orange = get_field('btn_orange') equeals真, ($btn_black = get_field('btn_black')未被處理而get_field('btn_black')返回一個好的值。

總之:$btn_black沒有設置,如果$btn_orange是。

這是我當前的代碼:

<?php if(($btn_orange = get_field('btn_orange')) || ($btn_black = get_field('btn_black'))): ?> 

     <div class="buttons"> 

     <?php if($btn_orange && ($btn_orange_url = get_field('btn_orange_url'))): ?> 

      <a class="btn btn-lg btn-primary" href="<?php echo $btn_orange_url; ?>"><?php echo $btn_orange; ?></a> 

     <?php elseif($btn_orange): ?> 

      <span class="btn btn-lg btn-primary"><?php echo $btn_orange; ?></span> 

     <?php endif;?> 

     <?php if($btn_black && ($btn_black_url = get_field('btn_black_url'))): ?> 

      <a class="btn btn-lg btn-black" href="<?php echo $btn_black_url; ?>"><?php echo $btn_black; ?></a> 

     <?php elseif($btn_black): ?> 

      <span class="btn btn-lg btn-black"><?php echo $btn_black; ?></span> 

     <?php endif;?> 

    </div> 

<?php endif; ?> 

現在我可以在單獨的if塊分開btn_orange$btn_black。 但我需要<div class="buttons">輸出如果其中一個或兩個都設置get_field()的值。

我可以在第一條if語句中完成此操作嗎?

編輯:問題解決了。我不應該在IF聲明中加入類似$x = func($parameter)的內容,而是首先按照dougtesting.net指出的先填充字符串。

+0

響應你知道你正在使用=(賦值運算符) (非嚴格比較運算符),對嗎? – GordonM

回答

1

當$ btn_orange爲true時,$ btn_black未填充get_field('btn_black')的值,因爲PHP停止計算IF語句的剩餘部分,因爲第一部分爲true。

最好的解決辦法是IF語句這樣之前填充變量...

$btn_orange = get_field('btn_orange'); 
$btn_black = get_field('btn_black'); 

if($btn_orange || $btn_black) { 
    etc... 
} 

然後這兩個變量可以在if語句內使用。

+0

這個伎倆!你能解釋爲什麼在我預先填充字符串之前我無法使用嗎?我這樣做的原因是編寫'較短'的代碼。我得出結論,在if中寫入'$ x = func('string')'只會將執行移動到'if if – odiw

+0

當然。是的,我讓你試圖寫更短的代碼。它的原因是在帶有OR(||)條件的IF語句中,只有其中的一個需要爲TRUE才能滿足條件並轉到if語句內的代碼。在你的情況下,當$ btn_orange爲true時,聲明和賦值給$ btn_black的代碼從不執行。 –

+0

我發現它總結了它的工作原理:PHP的&&,||,和和或運算符被實現爲「短路」運算符。一旦發現一個條件迫使總體條件的結果,後續條件的評估就會停止。 –

1

的狀況檢查,你必須使用==,而不是=

if(($btn_orange == get_field('btn_orange')) || ($btn_black == get_field('btn_black') 
+0

這打破了整個聲明 – odiw

+0

@odiw這意味着 – Jens

+0

@Jens我認爲OP想要賦值給這些變量,並檢查這些變量是否在條件內是假的。 – apokryfos

1

使用的是單=檢查您的if語句,而不是==

+0

是的,如果我使用'=='它會導致'FALSE' – odiw

1

這並不是條件範圍內賦值是個好主意。條件並不意味着這樣做(這就是爲什麼大多數其他編程語言明確禁止的)。

這樣做:

<?php $btn_orange = get_field('btn_orange'); 
     $btn_black = get_field('btn_black'); 
     if ($btn_orange || $btn_black): 
?> 

PHP(和大多數其他編程語言)將放棄狀態評估,如果有滿足,或不能滿足它沒有可能的方式。不這樣做會浪費計算時間和資源。

也可以考慮下面的代碼:

if (isset($array["index"])) && $array["index"] == "something) 

如果這兩個條件進行評估該代碼將打破,因爲如果不設置索引,然後訪問它會拋出一個錯誤。

+0

對不起,我看到dougtesting.net的答案在你的之前。你的答案同樣不錯:) – odiw

0

您可以通過分配變量插入前狀態

<?php 
$btn_orange = get_field('btn_orange'); 
$btn_black = get_field('btn_black'); 
if ($btn_orange || $btn_black): 
?> 

<div class="buttons"> 

    <?php if (isset ($btn_orange) && ($btn_orange_url = get_field('btn_orange_url'))): ?> 

試試這個,你也可以重新檢查,而不是由== var_dump();

相關問題