katsucurry
katsucurry

Reputation: 79

How to get a multidimensional array's name?

I'm trying to get the name of an array once I have found a specific value.

Specifically I'm looking to get the highest and lowest values within my array for a certain key, once I have those values I then need to get the name of the array holding those values.

My array looks like this -

Array
(
[123456] => Array
    (
        [value1] => 0.524
        [value2] => 0.898
        [value3] => -6.543
    )

[246810] => Array
    (
        [value1] => 0.579
        [value2] => 0.989
        [value3] => -5.035
    )

I have gotten the max value using this code -

max(array_column($statsArr, 'value1'));

This, correctly, gives me the value "0.579". I now need to get the value of the array holding this information so in this case I also want to get the value "246810". I don't know how to do this though, any help would be appreciated!

Upvotes: 1

Views: 106

Answers (4)

Andreas
Andreas

Reputation: 23958

You can search for the maximum value in the array_column.
I first prepare the array_column with correct keys by combining it, then find the max like you do.

Then we can array_search the value.

$value1 = array_combine(array_keys($statsArr), array_column($statsArr, 'value1'));

$max = max($value1);
echo $max . PHP_EOL;

$array = $statsArr[array_search($max, $value1)];
var_dump($array);

https://3v4l.org/Q9gOX


Alternatively you can array_values the $statsArr to make it 0 indexed just like the array_column.

$value1 = array_column($statsArr, 'value1');

$max = max($value1);
echo $max . PHP_EOL;

$array = array_values($statsArr)[array_search($max, $value1)];
var_dump($array);

Upvotes: 0

apokryfos
apokryfos

Reputation: 40683

For these kinds of problems I like using array_reduce. max is itself an array reduce operation which takes an array and returns a single value, PHP just offers it out of the box as convenience since it's a very common operation.

Here's an example code:

$array = array(
    123456 => array(
        'value1' => 0.524,
        'value2' => 0.898,
        'value3' => -6.543
    ),

    246810 => array(
        'value1' => 0.579,
        'value2' => 0.989,
        'value3' => -5.035
    )
);

$maxKey = array_reduce(array_keys($array), function ($carry, $key) use ($array) {
     if ($carry === null) {
        return $key;
     }
     return $array[$key]['value1'] > $array[$carry]['value1'] ? $key : $carry;
}, null);
$maxValue = $array[$maxKey]['value1'];

Working example: http://sandbox.onlinephpfunctions.com/code/ecd400ffec91a6436c2fb5ee0410658e22772d4b

Upvotes: 1

gbalduzzi
gbalduzzi

Reputation: 10176

function getMax($array, $field) {
  $maxValue = null;
  $maxKey = null;
  foreach($array as $key => $content) {
    if (is_null($maxValue) || $content[$field] > $maxValue) {
      $maxValue = $content[$field];
      $maxKey = $key;
    }
  }
  return [$maxValue, $maxKey];
}

Upvotes: 0

u_mulder
u_mulder

Reputation: 54841

Iterate over your array with a simple foreach and save required key:

$max = 0;
$founded_key = false;
foreach ($array as $key => $value) {
    if ($max < $value['value1']) {
        $max = $value['value1'];
        $founded_key = $key;
    }
}

echo $founded_key, ' - ', $max;

Upvotes: 2

Related Questions