2011-12-20 42 views
0

以字典爲例,假設我有以下陣列編目給定單詞的發音:當我在數組中查找多個鍵時,如何在PHP中執行有效的數組搜索?

$pronunciation["text"] = array("alpha", "beta", "gamma", "delta", "epsilon");

$pronunciation["definition"] = array(1, 2, NULL, NULL, 1);

text包含將被顯示在發音用戶,而definition包含該發音適用的列表中定義的ID。如果definitionNULL,則它不與任何特定定義相關聯,並應顯示在條目的其他位置。

現在,如果我嘗試做一些這樣的:

$key = array_search(1, $pronunciation["definition"]);

所有我會得到的是0,因爲這是在definition包含值的第一個關鍵。同樣,代NULL回報3,但這些都確實有,我試圖獲取另一個相關的關鍵。

有沒有辦法讓它返回所有相關的密鑰,而不必如for循環訴諸暴力方法?

回答

4

試試這個:

array_keys($pronunciation["definition"],1)

+0

我不知道'array_keys'額外的參數! – 2011-12-20 08:54:29

+0

你學習的東西每天都有新的.... +1爲@Jauzsika – 2011-12-20 09:08:38

+0

^^我剛剛發現這幾天前:)。 – Jauzsika 2011-12-20 18:34:21

0

恐怕不是那麼做,因爲你想要的功能。 編輯:不,有!見Jauzsika的答案。
你必須使用一個foreachfor循環。

function array_search_all($needle, $haystack) { 
    $keys = array(); 
    foreach ($haystack as $k => $v) if ($v === $needle) $keys[] = $k; 
    return $keys; 
} 

電話:

$keys = array_search_all(1, $pronunciation["definition"]); 
0

我不知道wheter它的速度更快或沒有,但我想如果有是一組數據,你必須來搜索,最好設置一個數組,其中數據是關鍵。

$data["alpha"] = 1 
$data["beta"] = 1 
//... 

您的所有的foreach應當從

foreach ($data as $item) { 

您的陣列修改成

foreach ($data as $item => $value) { 
0

重組到鍵控上的文本和使用該定義的值的單個陣列:

$pronunciation = array("alpha" => 1, 
         "beta" => 2, 
         "gamma" => NULL, 
         "delta" => NULL, 
         "epsilon" => 1); 

然後使用array_filter()構建值的子集,你需要

$searchVal = 1; 
$subset = array_filter($pronunciation, 
         create_function('$value', 'return $value == '.$searchVal.';') 
        ); 
var_dump($subset);