PHP - Get array value with a numeric index
Solution 1
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum');
$array = array_values($array);
echo $array[0]; //bar
echo $array[1]; //bin
echo $array[2]; //ipsum
Solution 2
array_values()
will do pretty much what you want:
$numeric_indexed_array = array_values($your_array);
// $numeric_indexed_array = array('bar', 'bin', 'ipsum');
print($numeric_indexed_array[0]); // bar
Solution 3
I am proposing my idea about it against any disadvantages array_values( )
function, because I think that is not a direct get function.
In this way it have to create a copy of the values numerically indexed array and then access. If PHP does not hide a method that automatically translates an integer in the position of the desired element, maybe a slightly better solution might consist of a function that runs the array with a counter until it leads to the desired position, then return the element reached.
So the work would be optimized for very large array of sizes, since the algorithm would be best performing indices for small, stopping immediately. In the solution highlighted of array_values( )
, however, it has to do with a cycle flowing through the whole array, even if, for e.g., I have to access $ array [1].
function array_get_by_index($index, $array) {
$i=0;
foreach ($array as $value) {
if($i==$index) {
return $value;
}
$i++;
}
// may be $index exceedes size of $array. In this case NULL is returned.
return NULL;
}
Solution 4
Yes, for scalar values, a combination of implode and array_slice will do:
$bar = implode(array_slice($array, 0, 1));
$bin = implode(array_slice($array, 1, 1));
$ipsum = implode(array_slice($array, 2, 1));
Or mix it up with array_values
and list
(thanks @nikic) so that it works with all types of values:
list($bar) = array_values(array_slice($array, 0, 1));
thom
Updated on July 08, 2022Comments
-
thom almost 2 years
I have an array like:
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); echo native_function($array, 0); // bar echo native_function($array, 1); // bin echo native_function($array, 2); // ipsum
So, this native function would return a value based on a numeric index (second arg), ignoring assoc keys, looking for the real position in array.
Are there any native function to do that in PHP or should I write it? Thanks
-
Pekka almost 13 yearsThis sounds like a bad idea. What do you need this for? Would it not be much preferable to actually have numeric keys in this case, and the
foo
value as a member of a sub-array? -
Alp almost 13 yearsI also think, that this looks like bad design. Can you tell us what you are trying to do? Maybe there is better solution.
-
Bitterblue almost 6 yearsPHP is bad design! Looks like there are different types of arrays in PHP. You have to convert one array to another array to actually access the items via index.
-
-
NikiC almost 13 years+1 Though I would have used
list($bar) = array_slice($array, 0, 1)
to remove the scalar value limitation ;) -
netcoder almost 13 years@nikic: I thought about that, unfortunately,
array_slice
will preserve string keys (even if preserve_keys is false), so you can't uselist
in that case, unless youarray_values
the resulting array. Anyway, I guess that is also a solution, edited. Thanks. -
Pancho almost 9 years...and, as of PHP 5.4, crush it down to: print (array_values($your_array)[0]);
-
user619271 almost 8 yearsBut what if
false
would be a fetched value? Returningnull
would be still bad but better thanfalse
. -
and.ryx almost 8 yearsConsidering the consistency of the type, I would get the value NULL or if the input index exceeds the size of the array, or if the target value from the index input is NULL. In this case I agree with you. However FALSE and NULL give the same result on the function empty(), which would be the next check would go to carry out in any scenario, it makes sense to call this function.
-
Blue Dev about 2 yearsAt least in non-ancient versions of php,
array_values($array)[0]
works fine for a reference, if you're not going to need to use it over and over. Iteratively yours would be the better option.