我有一个类似
的数组$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
)
如何通过提供值来获取密钥?
e.g。如果我搜索“buffaloes”,array_search可能会返回“2”。
由于
答案 0 :(得分: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
答案 1 :(得分: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个项目而'buffaloes'是最后一项,你必须进行20,000次比较。
换句话说,您需要重新设计数据结构,以便可以使用密钥查找内容,例如,更好的方法是重新排列数组,以便将要搜索的字符串作为键,例如:
$myArray['buffaloes'] = 76;
速度要快得多,因为它使用了更好的数据结构,因此它只需要进行最多n log n
次比较(其中n是数组中的项数)。这是因为数组实际上是一个有序映射。
另一个选项,如果您知道要搜索的值的确切值,请使用array_search
答案 2 :(得分: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
答案 3 :(得分:1)
你可以循环遍历数组的每个元素,测试每个条目的第一个元素是否等于“buffaloes”。
例如:
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));
向你发送你想要的2
。
答案 4 :(得分:1)
我从未听说过内置功能。如果你想要更通用的东西,那么你应该编写自己的函数并使用递归。也许array_walk_recursive会有所帮助