Answers:
echo array_search("car",array_keys($a));
array("val1", "val2", "car" => "val3")
这将不起作用,因为它将产生0
,这是错误的……
function arrayValuePosition($value, $array)
{
return array_search($value, array_keys($array));
}
虽然Fosco的答案没有错,但是有一个需要考虑的情况:混合数组。假设我有一个像这样的数组:
$a = array(
"nice",
"car" => "fast",
"none"
);
现在,PHP允许这种语法,但是它有一个问题:如果我运行Fosco的代码,我得到的对我来说0
是错误的,但是为什么会这样呢?
因为当在字符串和整数之间进行比较时,PHP将字符串转换为整数(在我看来,这有点愚蠢),因此当array_search()
搜索索引时,它会在第一个索引处停止,因为显然("car" == 0)
是true。
设置array_search()
为严格模式将无法解决问题,因为array_search("0", array_keys($a))
即使存在索引为0的元素,此操作也会返回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)
。
我想出的一个解决方案...与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
先进行排序的快,因此非常慢。