-1

I would like to search through a multidimensional array and return the value of the first key found. For example I am working with some geo tools and it returns this array. How can I recursively go through this array and return the first value of any key with the name lat? I tried array_walk but that seems to just return true or false. I tried array_filter but I dont think that is what its for? But I dont know how many sub arrays the array will have, so I need it to just go through each array set until it finds the key Im looking for, return the value and be done.

    array(4) {
  ["bounds"]=>
  array(2) {
    ["northeast"]=>
    array(2) {
      ["lat"]=>
      float(37.8468559)
      ["lng"]=>
      float(-121.891768)
    }
    ["southwest"]=>
    array(2) {
      ["lat"]=>
      float(37.779857)
      ["lng"]=>
      float(-122.027307)
    }
  }
  ["location"]=>
  array(2) {
    ["lat"]=>
    float(37.8215929)
    ["lng"]=>
    float(-121.9999606)
  }
  ["location_type"]=>
  string(11) "APPROXIMATE"
  ["viewport"]=>
  array(2) {
    ["northeast"]=>
    array(2) {
      ["lat"]=>
      float(37.8468559)
      ["lng"]=>
      float(-121.891768)
    }
    ["southwest"]=>
    array(2) {
      ["lat"]=>
      float(37.779857)
      ["lng"]=>
      float(-122.027307)
    }
  }
}

Here is an example of using array_filter. It works, only if I echo the value, but I want to return the value to use it at a different time. But when I do a return, it returns the whole sub array:

        function getLat($k,$v)
        {
        if(is_array($k)){
            foreach($k AS $key => $value)
            {

                if($key == 'lat')
                {

                    echo $value;

                }

            }}
        }

        $test = array_filter($response,'getLat',ARRAY_FILTER_USE_BOTH);

That echos 37.8215929. Which is what I want, but want to return it. When I change echo to return it returns this:

array(1) {
  ["location"]=>
  array(2) {
    ["lat"]=>
    float(37.8215929)
    ["lng"]=>
    float(-121.9999606)
  }
}
John
  • 9,840
  • 26
  • 91
  • 137
  • The correct behavior of `array_filter` is to return an array. Have you tired using `return $value;` instead of `echo $value;` in your function? – Enrico Dias Jan 20 '19 at 00:03
  • @EnricoDias Yeah I updated my question with the example of the array_filter function I tried to use. I replaced return with echo and it returns the whole sub array instead of the specific value of that key. – John Jan 20 '19 at 00:10

1 Answers1

0

Use the use keyword and an anonymous function with array_walk_recursive:

$return_value = null;
array_walk_recursive($array, function ($item, $key) use (&$return_value) {
  if($key === "lat") {
    $return_value = $item;
  }
});
return $return_value;

Pass a reference (&) to change a variable (in this case $return_value) outside the closure (anonymous function).

Laurens
  • 2,596
  • 11
  • 21