2012-05-25 47 views
0

當我運行以下時,我得到'B.C.',但我試圖得到'BC'array_search的問題

我設置array_search做了嚴格的比較,爲什麼不是返回"BC"

如果我通過"Alberta",我得到"AB",這是正確的。

<? 
function cleanProvince($province) 
{ 
    $values = array(
     'AB' => 'Alberta', 
     'BC' => 'B.C.', 
     'BC' => 'British Columbia', 
     'ON' => 'Ontario', 
     'ON' => 'Onatrio', 
     'ON' => 'Ont', 
     'NS' => 'Nova Scotia', 
     'QC' => 'Quebec' 
    ); 
    if ($key = array_search(@$province, $values, true)) { 
     return $key; 
    } else { 
     return $province; 
    } 
} 
echo (cleanProvince("B.C.")); 
?> 
+0

jrubins:他得到'B.C.'如帖子中指定的那樣。 – Overv

+2

您可能會更好地構建您的數組,其長名稱作爲鍵,縮寫作爲值。然後搜索不會重複的鍵。 –

+1

錯誤抑制運算符不是你的朋友。使用'isset()'等等(*也是,在這種情況下,它將永遠不會壓制任何東西*) – Dan

回答

7

一個數組中不能有多個鍵。當你這樣做時,第二個壓倒第一個。

$values = array(
    'AB'=>'Alberta', 
    'BC'=>'B.C.', 
    'BC'=>'British Columbia', # Overrides 'B.C.' 
    'ON'=>'Ontario', 
    'ON'=>'Onatrio', # Overrides 'Ontario' 
    'ON'=>'Ont', # Overrides 'Onatrio' 
    'NS'=>'Nova Scotia', 
    'QC'=>'Quebec', 
); 

你傳遞給"B.C."cleanProvince。這不是$values,所以array_search返回false,因此cleanProvince返回"B.C."

+0

啊哈 - 謝謝... – drschultz

+0

不客氣:-) –

+0

@Rocket如果鍵是不同的,值是相同的兩個元素,那麼array_search只返回第一個是嗎?如何從這裏獲取所有元素? –

1

正如已經建議,交換你的鍵和值會產生預期的效果,並避免調用array_search(),我只能假設具有相當高的開銷(在大多數情況下爭論的焦點,但如果所謂的迭代...)。

function getProvince($name){ 
    $values = array(
     'Onatrio' => 'ON', 
     'Ontaroi' => 'ON', 
     'O.N.' => 'ON', 
     // ... 
    ); 
    return isset($values[$name]) 
     ? $values[$name] 
     : $name; // or null I suppose 
}