Coder Perfect

Get the numeric index of an associative array in PHP

Problem

I’m working with an associative array and need to determine the numeric location of a key. I could manually cycle through the array to find it, but is there a more efficient technique built into PHP?

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

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

Asked by n00b

Solution #1

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

Answered by Fosco

Solution #2

$blue_keys = array_search("blue", array_keys($a));

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

Answered by quantumSoup

Solution #3

While Fosco’s response is correct, there is an exception to be made in this case: mixed arrays. Assume I have the following array:

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

Now, PHP accepts this syntax, but it has one flaw: when I run Fosco’s code, I receive 0 instead of 1, which is incorrect for me, but why does this happen? Because PHP turns strings to numbers when comparing strings to integers (which I think is foolish), when array search() searches for the index, it stops at the first one because (“car” == 0) appears to be true. Setting array_search() to strict mode won’t solve the problem because then array_search(“0”, array_keys($a)) would return false even if an element with index 0 exists. So my solution just converts all indexes from array_keys() to strings and then compares them correctly:

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

The output is 1, which is correct.

EDIT: As Shaun pointed out in the comments below, the same thing holds true for the index value if you’re looking for an int index that looks like this:

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

Because you’ll always get 0, which is incorrect, you need cast the index (if you’re using a variable) to a string like this:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

Answered by Xriuk

Solution #4


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

Answered by Asterión

Solution #5

The approach with array search would be quite heavy, and straight search is unneeded in this case.

A far superior solution would be:

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

On large arrays, this type of search might perform considerably better. The difficulty, which would be O(n)=1 instead of O(n)=n, is the cause (in worst of the possible variants). So, instead of 1000000 iterations, for an array with 1000000 elements, it would take 1 iteration.

Answered by nojitsi

Post is based on https://stackoverflow.com/questions/3365766/php-get-numeric-index-of-associative-array