Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php - get numeric index of associative array

Tags:

arrays

php

People also ask

What is used to find the index of an associative array?

Although the array_keys() function can be used to get an indexed array of keys for an associative array. As the resulting array is indexed the elements of the resulting array can be accessed by integer index.

How do you find the key value of associative array?

Answer: Use the PHP array_keys() function You can use the PHP array_keys() function to get all the keys out of an associative array.

What is array_keys () used for?

The array_keys() function returns all the keys of an array. It returns an array of all the keys in array.

How do you find array keys?

The array_keys() function is used to get all the keys or a subset of the keys of an array. Note: If the optional search_key_value is specified, then only the keys for that value are returned. Otherwise, all the keys from the array are returned. Specified array.


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

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

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


While Fosco's answer is not wrong there is a case to be considered with this one: mixed arrays. Imagine I have an array like this:

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

Now, PHP allows this kind of syntax but it has one problem: if I run Fosco's code I get 0 which is wrong for me, but why this happens?
Because when doing comparisons between strings and integers PHP converts strings to integers (and this is kinda stupid in my opinion), so when array_search() searches for the index it stops at the first one because apparently ("car" == 0) is 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)));

Prints 1, which is correct.

EDIT:
As Shaun pointed out in the comment below, the same thing applies to the index value, if you happen to search for an int index like this:

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

You will always get 0, which is wrong, so the solution would be to cast the index (if you use a variable) to a string like this:

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


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


The solution with array_search would be really heavy, and it's unnecessary to use straight search in this situation.

Much better solution would be:

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

This type of search would have much better performance on big arrays. The reason is the difficulty, that would be O(n)=1 instead of O(n)=n (in worst of the possible variants). So for an array with 1000000 elements it would make 1 iteration instead of 1000000.