PHP - 获取关联数组的数字索引

175

我有一个关联数组,需要找到某个键的数值位置。 我可以手动遍历数组来查找,但PHP中是否有更好的方法?

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

// echo (find numeric index of $a['car']); // output: 1

这个回答解决了你的问题吗?在PHP中获取数组中某个值的索引 - TylerH
7个回答

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

7
PHP保证关联数组的顺序吗? - Kevin Burke
9
除非使用排序函数,否则它不会重新排序。不确定您正在寻找什么样的保证,但不像 JavaScript 模型那样,关联数组没有静态顺序。 - Fosco
7
由“array_keys”给出的索引不一定与原始数组的索引匹配。例如,如果您使用“unset”或其他一些函数更改了数组,则原始数组中将留下一个间隙,但是array_keys将生成一个新数组。 - SEoF
5
如果关联数组是混合的,即 array("val1", "val2", "car" => "val3"),则此方法无效,它会返回 0,这是错误的…… - Xriuk
这有什么不同于@quantamSoup的回答? - Mystical

38

5
$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索引,则同样适用于索引值:

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

2
在传递变量时,应将其转换为字符串,因为将零传递给关联数组会产生相同的负面影响。例如:var_dump(array_search(0, array_map("strval", array_keys($a))));将始终输出int (0),而不是bool (false) - Shaun Cockerill
@ShaunCockerill 没错!我更新了我的回答,感谢你指出这一点! - Xriuk

3

使用array_search的解决方案会非常繁重,在这种情况下不需要使用直接搜索。

更好的解决方案是:

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

这种类型的搜索在处理大型数组时表现更佳。


1
array flip 不是 O(n) = 1。虽然你的解决方案在性能方面更好,我认为它是更好的解决方案。但它并不真正是 O(n) = 1。 - Stanley Aloh

2

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

这段代码创建了一个关联数组 `$a`,其中包含三个键值对。然后使用 `array_search()` 函数在 `$a` 数组中查找特定的键名并返回相应的键名所在位置。输出结果将是键名 `'car'`、`'blue'` 和 `'number'` 在数组中的位置。

1

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

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

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


0

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

3
是的,PHP有成千上万个内置函数是有原因的。通常情况下,这些函数比在PHP代码中手动编写的等价逻辑更快。 - Bill Karwin
3
这可能比array_search更快,因为array_search需要先排序,所以非常慢。 - Alasdair
啊,但内置代码是预编译的,搜索很可能是二分查找(假设它首先对项目进行排序)。 - SEoF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接