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

n00*_*00b 144 php arrays

我有一个关联数组,我需要找到一个键的数字位置.我可以手动遍历数组来找到它,但有没有更好的方法构建到PHP?

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

// echo (find numeric index of $a['car']); // output: 1
Run Code Online (Sandbox Code Playgroud)

Fos*_*sco 251

echo array_search("car",array_keys($a));
Run Code Online (Sandbox Code Playgroud)

  • "array_keys"给出的索引不一定与原始数组的索引匹配.例如,如果您使用"unset"或许多其他函数更改了数组,则原始数组的索引中将留有间隙,但array_keys将生成一个新数组. (6认同)
  • PHP是否保证关联数组的顺序? (5认同)
  • @KevinBurke除非你使用排序功能,否则它不会重新排序.不确定您正在寻找什么样的保证,但它不像JavaScript模型那样没有静态顺序到关联数组. (5认同)
  • 如果关联数组是混合的,那么这不起作用,对于`array("val1","val2","car"=>"val3")`它会产生`0`,这是错误的...... (4认同)

qua*_*oup 34

$blue_keys = array_search("blue", array_keys($a));
Run Code Online (Sandbox Code Playgroud)

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

  • +1保存了我谷歌搜索该功能的5个时刻,我用它来输入这个评论. (8认同)

Xri*_*iuk 5

虽然 Fosco 的答案并没有错,但有一种情况需要考虑:混合数组。想象一下我有一个像这样的数组:

$a = array(
  "nice",
  "car" => "fast",
  "none"
);
Run Code Online (Sandbox Code Playgroud)

现在,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)));
Run Code Online (Sandbox Code Playgroud)

打印出来1,这是正确的。

编辑:
正如肖恩在下面的评论中指出的那样,如果您碰巧搜索这样的 int 索引,那么同样的事情也适用于索引值:

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));
Run Code Online (Sandbox Code Playgroud)

您总是会得到0,这是错误的,因此解决方案是将索引(如果您使用变量)转换为如下字符串:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
Run Code Online (Sandbox Code Playgroud)

  • 传递变量时,还应该将其转换为字符串,因为将零传递给关联数组也会产生相同的负面影响。例如: `var_dump(array_search(0, array_map("strval", array_keys($a))));` 将始终输出 `int (0)`,而不是 `bool (false)`。 (2认同)