2010-08-12 46 views
0

您好,我目前運行這段代碼,array_key_exists在foreach

<?php foreach($search_results as $rslt) : ?> 
    <? 
    $code = $rslt['code']; 
    if(array_key_exists($code, $short_list)) { 
     $set = "set"; 
    } 
    ?> 
    <div class="row <? echo $set;?>"></div> 

我想實現的是,如果陣列等於$rslt['code']然後給類的設置,否則DIV不要了陣列我檢查看起來是這樣的,

Array 
(
    [849650047] => Y 
    [849652539] => Y 
    [849652774] => Y 
    [849656557] => Y 
    [849652014] => Y 
) 

然而,每當我循環所有我的div設置'set'類設置?它應該只是其中array_key等於當前$code

+0

如果你願意使用短標籤,那麼'<?='比'<?更可讀。 echo',你可以在關閉'?>'之前省略最後一個分號。你的最後一行可能是'

'。 – meagar 2010-08-12 14:48:44

+0

我受不了短標記符號。我更喜歡更詳細的'<?php echo $ set; ''over''...... – ircmaxell 2010-08-12 14:58:18

回答

4

嘛,他們都是一套,因爲你永遠不會初始化$set變量:

<?php foreach($search_results as $rslt) : ?> 
    <? 
    $set = ''; 
    $code = $rslt['code']; 
    if(array_key_exists($code, $short_list)) { 
     $set = "set"; 
    } 
    ?> 
    <div class="row <? echo $set;?>"></div> 

而且,只需使用isset()代替array_key_exists(它更高效,少羅嗦):

if(isset($short_list[$code])) { 
     $set = "set"; 
    } 
+0

它不會初始化,它不會重置$ set的值,而在下一個成員上迭代。 – KoolKabin 2010-08-12 14:28:16

+0

那麼,它永遠不會初始化它。這最多會發出通知,或者更糟的是打開register_globals攻擊。始終初始化所有變量。特別是如果你將它們設置爲條件,並在條件之外使用它們... – ircmaxell 2010-08-12 14:31:54

0

只需在循環結束時添加unset($set);即可。或者你可以做類似...

<?php foreach($search_results as $rslt) : ?> 
    <div class="row <? print array_key_exists($rslt['code'], $short_list)? 'set':''; ?>"></div> 
<?php endforeach; ?> 
0

避免在PHP中使用替代控制結構語法。這很醜陋,從長遠來看讓你的代碼更難維護。還要儘量避免使用<?php ?>進行過度的上下文切換;它使你的邏輯不必要地難以遵循。

<?php 

foreach ($search_results as $result) { 
    $set = isset($short_list[$result['code']]) ? ' set' : ''; 
    echo "<div class=\"row$set\"></div>"; 
} 

注意,如果鍵數組中存在,但它的價值是零isset()將返回false。即使$short_list[$result['code']]的值爲空,也要注意是否應用「設置」類。