2013-03-29 193 views
2

我一直在努力與array_search了一下,雖然我想我現在明白了,但我只是想確保我理解我的代碼執行方式背後的邏輯。array_search布爾返回值

我想寫一個函數,它會將一個元素添加到數組中,如果它不在數組中,則將其刪除,如果是這樣,則將其刪除。很簡單,對吧?

$k = array_search($needle, $haystack) 
if ($k === FALSE) { 
    $haystack[] = $needle; 
} else { 
    unset($haystack[$k]); 
} 

這是寫這個最有效的方法嗎?似乎應該有一種方法來分配$ k的值,同時檢查它的值是否爲FALSE或其他任何值(包括0)?

+0

看起來與缺少的'開好;在第一線 –

回答

2

您可以縮短你的代碼是這樣的:

if (($k = array_search($needle, $haystack)) === FALSE) { 
    $haystack[] = $needle; 
} else { 
    unset($haystack[$k]); 
} 

的第一行代碼進行檢索,存儲在$ k中返回的值,並檢查該值正好等於FALSE或沒有。

文檔:array_search

+1

@ cpattersonv1''$ k'始終設置。如果沒有找到'$ needle',或者帶有一個鍵值來指示在$ $ haystack陣列中找到'$ needle'的位置,則使用false。 [查看array_search的手冊頁](http://php.net/array_search)瞭解更多信息。 – Jocelyn

+0

@ cpattersonv1圓括號在那裏是有原因的。我不明白你爲什麼要刪除它們。 – Jocelyn

0

你的代碼是好的,但你可以這樣來做: -

if (($k = array_search($needle, $haystack)) == FALSE) 
{ 
$haystack[] = $needle; 
} 
else 
{ 
unset($haystack[$k]); 
} 
+0

您發佈了與我之前發佈的代碼完全相同的代碼... – Jocelyn

+0

不,他錯過了三重等號。如果匹配元素的鍵值爲0,這將不起作用。 – caseyy

0

與函數進行包裝,這樣你就可以重新使用它,你有什麼效果很好之外。大多數其他例子只是重寫你已經寫過的東西。

<?php 
$haystack = array(
'5','6','7', 
); 

$needles = array('3','4','2','7'); 
print_r($haystack); 


function checker($needle,$haystack){ 
    $k = array_search($needle, $haystack); 
    if ($k === FALSE) { 
     $haystack[] = $needle; 
    } else { 
     unset($haystack[$k]); 
    } 
    return $haystack; 
} 


foreach($needles as $value){ 
    $haystack = checker($value,$haystack); 
    print_r($haystack); 

} 



?>