2017-10-05 120 views
3
if($object_type == 'regular') { 
    if($u_login == $object_user || $u_access >= 3 || $object_access >= 4) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 
} else 
if($object_type == 'comment') { 
    if($u_login == $object_user || $u_access >= 2 || $object_access >= 4) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 
} 

因此,如果對象是不同類型的用戶需要具有diff訪問級別。如何簡化這個陳述,以避免重複?PHP:有人可以爲我簡化這個IF語句嗎?


我一般都忘記了if的組合,謝謝你提醒我吧!

if($u_login == $object_user || $object_access >= 4 || ($object_type == 'regular' && $u_access >= 3) || ($object_type == 'comment' && $u_access >= 2)) { 
    echo '<p>&nbsp;</p>'; 
    echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
} 

回答

2

兩個條件檢查$u_login == $object_user$object_access >= 4,只有$object_type$u_access不同。因此,您可以將這兩項檢查提高一級,並在$object_type$u_access >= 3內檢查外部情況。

因此,聲明可以重新寫成這樣,縮一行代碼:

if($u_login == $object_user || $object_access >= 4) { 
    if($object_type == 'regular' && $u_access >= 3) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 
    else if($object_type == 'comment' && $u_access >= 2) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 
} 

雖然這取決於你的「簡化」的定義,你也可以切出全部外有條件通過利用一些括號:

if(($u_login == $object_user || $object_access >= 4) && ($object_type == 'regular' && $u_access >= 3)) { 
    echo '<p>&nbsp;</p>'; 
    echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
} 
else if(($u_login == $object_user || $object_access >= 4) && ($object_type == 'comment' && $u_access >= 2)) { 
    echo '<p>&nbsp;</p>'; 
    echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
} 

然而,它沒有價值,無論你的條件句目前做同樣的事情,所以代碼甚至可以簡化爲:

echo '<p>&nbsp;</p>'; 
echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 

希望這有助於! :)

+0

如果'$ u_login!= $ object_user'和'$ object_access <= 3',它不起作用。即使只有一個'$ u_access'事件成立,Echo也應該被激活。 UPD:等等,我會測試你提供的其他代碼。 – DIES

+1

@DIES - 您的問題本身並未提供用例來說明這種情況;你現有的代碼將不會覆蓋。你總是可以改變這兩個條件來說'|| $ u_access'而不是'|| $ u_access> = 3',這將解決這個問題:) –

+0

@ObsidianAge你的內在條件稍微偏離。你需要使用'&&'而不是'||'來保存邏輯。 –

1

這可能不是最好的地方尋求幫助重構你的代碼,但到底是什麼。請注意,您有兩個條件完全相同,並在兩種情況下都進行檢查。爲什麼不把它們拉到根級?

if($u_login == $object_user || $object_access >= 4) { 
    if($object_type == 'regular' && $u_access >= 3) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 

    if($object_type == 'comment' && $u_access >= 2) { 
     echo '<p>&nbsp;</p>'; 
     echo '<p><span class="r_button"><a href="/delete_link/'.$object_key.'?link_id=2">'.ex_lang('str_btn_delete').'</a></span></p>'; 
    } 
} 

請注意,我們並不需要一個else在這裏的任何地方,因爲提供的條件,本質上是互斥的。這可以使可讀性更簡單一些。