PHP ищет многоцелевой массив по ключу - PullRequest
0 голосов
/ 20 января 2019

Я хотел бы выполнить поиск в многомерном массиве и вернуть значение первого найденного ключа. Например, я работаю с некоторыми геоинструментами, и он возвращает этот массив. Как я могу рекурсивно пройти через этот массив и вернуть первое значение любого ключа с именем lat? Я попытался array_walk, но, похоже, просто возвращает истину или ложь. Я попытался array_filter, но я не думаю, что это для чего? Но я не знаю, сколько подмассивов будет в массиве, поэтому мне нужно, чтобы он просто просматривал каждый набор массивов, пока не найдет нужный мне ключ, вернет значение и все будет готово.

    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)
    }
  }
}

Вот пример использования array_filter. Это работает, только если я повторяю значение, но я хочу вернуть значение, чтобы использовать его в другое время. Но когда я делаю возврат, он возвращает весь вложенный массив:

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

Это эхо 37,8215929. Что я хочу, но хочу вернуть. Когда я изменяю echo для возврата, он возвращает это:

array(1) {
  ["location"]=>
  array(2) {
    ["lat"]=>
    float(37.8215929)
    ["lng"]=>
    float(-121.9999606)
  }
}

1 Ответ

0 голосов
/ 20 января 2019

Используйте ключевое слово use и анонимную функцию с 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;

Передайте ссылку (&), чтобы изменить переменную (в данном случае $ return_value) вне замыкания (анонимная функция).

...