我有一个关联数组,需要找到某个键的数值位置。 我可以手动遍历数组来查找,但PHP中是否有更好的方法?
$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
// echo (find numeric index of $a['car']); // output: 1
echo array_search("car",array_keys($a));
array("val1", "val2", "car" => "val3")
,则此方法无效,它会返回 0
,这是错误的…… - Xriuk$blue_keys = array_search("blue", array_keys($a));
$a = array(
"nice",
"car" => "fast",
"none"
);
0
,这是错误的。为什么会发生这种情况?因为在字符串和整数之间进行比较时,PHP将字符串转换为整数(在我看来有些愚蠢),所以当array_search()
搜索索引时,它会在第一个位置停止,因为显然("car" == 0)
是真的。将array_search()
设置为严格模式无法解决问题,因为即使存在具有索引0的元素,array_search("0", array_keys($a))
也将返回false。因此,我的解决方法只是将array_keys()
中的所有索引转换为字符串,然后正确比较它们:echo array_search("car", array_map("strval", array_keys($a)));
打印出正确的1
。
编辑:
正如Shaun在下面的评论中指出的那样,如果您像这样搜索int索引,则同样适用于索引值:
$a = array(
"foo" => "bar",
"nice",
"car" => "fast",
"none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));
您始终会得到0
,这是错误的,所以解决方案是将索引(如果使用变量)转换为字符串,像这样:
$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
var_dump(array_search(0, array_map("strval", array_keys($a))));
将始终输出int (0)
,而不是bool (false)
。 - Shaun Cockerill使用array_search的解决方案会非常繁重,在这种情况下不需要使用直接搜索。
更好的解决方案是:
$keyIndexOfWhichYouAreTryingToFind = 'c';
$array = [
'a' => 'b',
'c' => 'd'
];
$index = array_flip(array_keys($array))[$keyIndexOfWhichYouAreTryingToFind];
这种类型的搜索在处理大型数组时表现更佳。
$a = array(
'blue' => '好看的',
'car' => '快速的',
'number' => '没有'
);
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));
所有基于array_keys的解决方案都不适用于混合数组。解决方案很简单:
echo array_search($needle,array_keys($haystack), true);
来自php.net: 如果第三个参数strict被设置为TRUE,则array_search()函数将在堆栈中搜索相同的元素。这意味着它还将对堆栈中的针进行严格类型比较,并且对象必须是相同的实例。
我想到的一个解决方案...与Fosco的解决方案相比可能相对低效:
protected function getFirstPosition(array$array, $content, $key = true) {
$index = 0;
if ($key) {
foreach ($array as $key => $value) {
if ($key == $content) {
return $index;
}
$index++;
}
} else {
foreach ($array as $key => $value) {
if ($value == $content) {
return $index;
}
$index++;
}
}
}
array_search
更快,因为array_search
需要先排序,所以非常慢。 - Alasdair