Php-得到关联数组的数字索引

我有一个关联数组,我需要找到一把钥匙的数字位置。 我可以手动遍历数组来找到它,但是有没有更好的方法构建到 PHP 中呢?

$a = array(
'blue'   => 'nice',
'car'    => 'fast',
'number' => 'none'
);


// echo (find numeric index of $a['car']); // output: 1
135988 次浏览
$blue_keys = array_search("blue", array_keys($a));

Http://php.net/manual/en/function.array-keys.php

echo array_search("car",array_keys($a));

一个我想出来的解决方案... 和 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++;
}
}
}

$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));

虽然 Fosco 的答案没有错,但是有一个 需要考虑的情况: 混合数组。假设我有一个这样的数组:

$a = array(
"nice",
"car" => "fast",
"none"
);

现在,PHP 允许这种语法,但是它有一个问题: 如果我运行 Fosco 的代码,我会得到 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 索引,同样的事情也适用于 index 值:

$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)));

所有基于 array _ key 的解决方案都不适用于混合数组。解决方案很简单:

echo array_search($needle,array_keys($haystack), true);

来自 php.net: 如果第三个严格参数被设置为 TRUE,那么 array _ search ()函数将在干草堆中搜索相同的元素。这意味着它还将对干草堆中的针进行严格的类型比较,并且对象必须是相同的实例。

Array _ search 的解决方案非常繁琐,在这种情况下没有必要使用直接搜索。

更好的解决办法是:

$keyIndexOfWhichYouAreTryingToFind = 'c';
$array = [
'a' => 'b',
'c' => 'd'
];
$index = array_flip(array_keys($array))[$keyIndexOfWhichYouAreTryingToFind];

这种类型的搜索在大数组上会有更好的性能。