52

In PHP, say that you have an associative array like this:

$pets = array(
    "cats" => 1,
    "dogs" => 2,
    "fish" => 3
);

How would I find the key with the lowest value? Here, I'd be looking for cats.

Is there some built in PHP function that I've missed which does this? It would also be great if there was a solution that accounted for several values being identical, as below:

$pets = array(
    "cats" => 1,
    "dogs" => 1,
    "fish" => 2
);

Above, I wouldn't mind if it just output either; cats or dogs.

Thanks in advance.

6 Answers 6

121

array_keys is your friend:

$pets = array(
    "cats" => 1,
    "dogs" => 2,
    "fish" => 3
);
array_keys($pets, min($pets));  # array('cats')

P.S.: there is a dup here somewhere on SO (it had max instead of min, but I can distinctly remember it).

Sign up to request clarification or add additional context in comments.

4 Comments

That's a clever one =) Maybe you should mention that it returns a list of 1 or more values (unless the array is empty.)
min(array_keys($pets, min($pets)); will ensure that you get ONE single answer, not an array. That can be confusing to people who simply copy and paste this method.
@Augie Gardner current(array_keys($pets, min($pets)); - little bit faster
The above code is elegant but not optimal. It involves several operations (finding miniumum of N elements, find N keys, find the key with the value in a subset N). A faster version would be a search algorithm. I never did a benchmark about this, though.
14

Thats how i did it.

$pets = array(
    "cats" => 1,
    "dogs" => 2,
    "fish" => 3
);

array_search(min($pets), $pets); 

I hope that helps

Comments

3

Might try looking into these:

1 Comment

The links above are to the horrible w3schools, here are the proper PHP manual links (to save you a few seconds): php.net/manual/en/function.natcasesort.php php.net/manual/en/function.natsort.php
2
$min_val = null;
$min_key = null;
foreach($pets as $pet => $val) {
  if ($val < $min_val) {
    $min_val = $min;
    $min_key = $key;
  }
}

You can also flip the array and sort it by key:

$flipped = array_flip($pets);
ksort($flipped);

Then the first key is the minimum, and its value is the key in the original array.

1 Comment

You forgot to close a bracket. And using array_keys and min, as suggested by SilentGhost will be easier and faster.
1

Another approach for retrieving a single string is by using a desirable sorting method and retrieving the first key directly by using key() on the sorted array. In this instance the key with the lowest value is desired, asort will sort from lowest to highest values and reset the internal pointer. To retrieve the reverse (highest to lowest) use arsort.

Example: https://3v4l.org/5ijPh

$pets = array(
   "dogs" => 2,
   "cats" => 1,
   "fish" => 3
);
asort($pets);
var_dump(key($pets));
//string(4) "cats"
$pets = array(
   "dogs" => 1,
   "cats" => 1,
   "fish" => 3
);
asort($pets);
var_dump(key($pets));
//string(4) "dogs"

Take note that all of the PHP array sorting methods will alter the array by-reference. To prevent altering the original array, create a copy of the array or use an Iterator.

$petsSorted = $pets;
asort($petsSorted);
key($petsSorted);

Comments

-3

find the highest value

print max(120, 7, 8, 50);

returns --> 120

$array = array(100, 7, 8, 50, 155, 78);
print max($array);

returns --> 155

find the lowest value

print min(120, 7, 8, 50);

returns --> 7

$array = array(50, 7, 8, 101, 5, 78);
print min($array);

returns --> 5

1 Comment

The question is about finding the key, not just the value.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.