2009-12-19 113 views
0

我有這樣PHP:獲得多維數組中的密鑰?

$myArray =array 
(
"0"=>array("dogs",98), 
"1"=>array("cats",56), 
"2"=>array("buffaloes",78) 
) 

數組我如何能得到通過提供價值的關鍵?

例如如果我搜索「水牛」,array_search可能會返回「2」。

感謝

+0

你可能做錯了什麼... – 2009-12-19 19:31:46

+0

你在Yacoby回答說,除非你有重要的理由保持你的數據,你應該重新設計它。 – 2009-12-19 19:42:42

+0

你沒事。我承認。但是,是的,實際上有一個特定的情況,我需要這樣的結構,並且該陣列中的項目數不超過10個,因此從性能和效率的角度來看,對我來說這很好。 – baltoro 2009-12-19 21:04:26

回答

2
$myArray =array 
(
"0"=>array("dogs",98), 
"1"=>array("cats",56), 
"2"=>array("buffaloes",78) 
); 

function findInArray($term, $array) { 
    foreach($array as $key => $val) { 
     if(in_array($term, $val, true)) { 
      return $key; 
     } 
    } 
} 

echo findInArray('buffaloes', $myArray); // 2 
echo findInArray(78, $myArray); // 2 
+0

謝謝戈登,但如果我用0替換98,56和78會怎麼樣。在那種情況下,它總是失敗,因爲它總是返回零。 – baltoro 2009-12-19 20:38:05

+0

查看in_array的手冊。我現在已經成爲第三個參數,然後它應該再次按預期工作。 – Gordon 2009-12-19 21:06:43

2
function asearch($key, $myArray) { 
    for ($i = 0; $i < sizeof($myArray); $i++) { 
    if ($myArray[$i][0] == $key) { 
     return $i; 
    } 
    } 
    return -1; # no match 
} 

雖然,你可能會想你的陣列重組到:

$myarray = array(
    'dogs' => 98, 
    'cats' => 56, 
    'buffaloes' => 78 
); 

而只是做:

$myArray['buffaloes']; # 78 
2

你能做到這一點的唯一方法是迭代每個項目,並預成形一個Linear Search

$i = -1; 
foreach ($myArray as $key => $item){ 
    if ($item[0] == 'buffaloes'){ 
     $i = $key; 
     break; 
    } 
} 
//$i now holds the key, or -1 if it doesn't exist 

正如你所看到的,它真的非常低效,就好像你的數組有20,000個項目,'水牛'是最後一個項目,你必須進行20,000次比較。

換句話說,您需要重新設計您的數據結構,以便您可以使用該鍵查找某些內容,例如,更好的方法可能是重新排列陣列,以便將搜索的字符串作爲關鍵字,例如:

$myArray['buffaloes'] = 76; 

這是更快得多,因爲它使用一個更好的數據結構,使得它只有至多n log n比較(其中,n是陣列中的項目數)。這是因爲數組實際上是一個有序的映射。

另一種選擇,如果你知道你正在尋找價值的精確值是使用array_search

+0

是的,你是對的。 :) – baltoro 2009-12-19 19:42:02

1

您可以遍歷數組中的每個元素,測試如果每個條目的第一個元素是等於「水牛」。

例如:

foreach ($myArray as $key => $value) { 
    if ($value[0] == "buffaloes") { 
     echo "The key is : $key"; 
    } 
} 

會得到你:

The key is : 2 


另一個想法,如果你想整個入境,可能與array_filter工作(更可笑嗎?)以及爲「bufalloes」條目返回true的回調函數:

function my_func($val) { 
    return $val[0] == "buffaloes"; 
} 
$element = array_filter($myArray, 'my_func'); 
var_dump($element); 

會得到你:

array 
    2 => 
    array 
     0 => string 'buffaloes' (length=9) 
     1 => int 78 

而且

var_dump(key($element)); 

Gves你你想要的2

1

我從來沒有聽說過內置函數。如果你想要更通用的東西,那麼你需要編寫你自己的函數並使用遞歸。也許array_walk_recursive會有幫助