我有這樣PHP:獲得多維數組中的密鑰?
$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
)
數組我如何能得到通過提供價值的關鍵?
例如如果我搜索「水牛」,array_search可能會返回「2」。
感謝
我有這樣PHP:獲得多維數組中的密鑰?
$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
)
數組我如何能得到通過提供價值的關鍵?
例如如果我搜索「水牛」,array_search可能會返回「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
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
你能做到這一點的唯一方法是迭代每個項目,並預成形一個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
是的,你是對的。 :) – baltoro 2009-12-19 19:42:02
您可以遍歷數組中的每個元素,測試如果每個條目的第一個元素是等於「水牛」。
例如:
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
。
我從來沒有聽說過內置函數。如果你想要更通用的東西,那麼你需要編寫你自己的函數並使用遞歸。也許array_walk_recursive會有幫助
你可能做錯了什麼... – 2009-12-19 19:31:46
你在Yacoby回答說,除非你有重要的理由保持你的數據,你應該重新設計它。 – 2009-12-19 19:42:42
你沒事。我承認。但是,是的,實際上有一個特定的情況,我需要這樣的結構,並且該陣列中的項目數不超過10個,因此從性能和效率的角度來看,對我來說這很好。 – baltoro 2009-12-19 21:04:26