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


154

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

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

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

Answers:


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

5
PHP是否保证关联数组的顺序?
凯文·伯克

7
@KevinBurke除非您使用排序功能,否则它不会重新排序。不确定要寻找哪种保证,但这与JavaScript模型不一样,在JavaScript模型中,关联数组没有静态顺序。
福斯科(Fosco)2012年

6
由“ array_keys”给出的索引不一定与原始数组的索引匹配。例如,如果您使用“ unset”或许多其他函数更改了数组,则原始数组的索引中将留有一个空格,但是array_keys会生成一个新数组。
SEoF

4
如果关联数组混合,array("val1", "val2", "car" => "val3")这将不起作用,因为它将产生0,这是错误的……
Xriuk



2

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



2

虽然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)));

1
传递变量时,还应将其强制转换为字符串,因为将零传递给关联数组将具有相同的负面影响。例如:var_dump(array_search(0, array_map("strval", array_keys($a))));将始终输出int (0),而不是bool (false)
Shaun Cockerill

@ShaunCockerill对!更新了我的答案,感谢您指出!
Xriuk

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++;
   }
  }
 }

2
是的,PHP有数千个内置函数是有原因的。这些通常比用PHP代码编写的等效逻辑要快得多。
Bill Karwin

3
这可能比array_search先进行排序的快,因此非常慢。
阿拉斯代尔

嗯,但是内置代码是预编译的,搜索很可能是二进制搜索(假设它首先对项目进行排序)。
SEoF

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.