Как я могу получить доступ к данным, полученным из shell_exec?

У меня есть php-скрипт, затем я запускаю его по строкам.

Я запустил эту строку: $ip = trim(shell_exec("dig +short myip.opendns.com @resolver1.opendns.com"));

Я получил: 50.198.81.174

Затем я запускаю следующую строку:

$php_info = trim(shell_exec("curl ipinfo.io/".$ip));

я получил

 """ {\n "ip": "50.198.81.174",\n "hostname": "50-198-81-174-static.hfc.comcastbusiness.net",\n "city": "Braintree",\n "region": "Massachusetts",\n "country": "US",\n "loc": "42.2038,-71.0022",\n "org": "AS7922 Comcast Cable Communications, Inc.",\n "postal": "02184"\n } """ 

Я пытаюсь получить к нему результат, например город

echo ($php_info['city']);

Я не мог. 🙁

Как правильно обращаться к ним?

Вы используете неправильную команду. Вы должны использовать exec(); Он имеет встроенный аргумент для вывода результатов в массив, так что вам не нужно делать это с помощью кучи кода. Затем вы можете просто проанализировать элемент массива, в котором есть информация, которую вы хотите.

 <?php $info = exec("curl ipinfo.io/8.8.8.8",$arrInfo); print_r($arrInfo); 

// выводит

 Array ( [0] => { [1] => "ip": "8.8.8.8", [2] => "hostname": "google-public-dns-a.google.com", [3] => "city": "Mountain View", [4] => "region": "California", [5] => "country": "US", [6] => "loc": "37.3860,-122.0838", [7] => "org": "AS15169 Google Inc.", [8] => "postal": "94040" [9] => } ) 

ИЛИ вы можете просто использовать JSON_DECODE и продолжать использовать shell_exec (); Это даст вам точные значения в массиве.

 <?php $info = shell_exec("curl ipinfo.io/8.8.8.8"); print_r(json_decode($info,true)); ?> 

//вывод

 Array ( [ip] => 8.8.8.8 [hostname] => google-public-dns-a.google.com [city] => Mountain View [region] => California [country] => US [loc] => 37.3860,-122.0838 [org] => AS15169 Google Inc. [postal] => 94040 ) 

Json_decode с истинным флагом выведет его в ассоциативный массив.

Я думаю, это поможет вам. Чтобы получить доступ к каждой спецификации, вам просто нужно использовать индекс списка

 <?php $str = '""" {\n "ip": "50.198.81.174",\n "hostname": "50-198-81-174-static.hfc.comcastbusiness.net",\n "city": "Braintree",\n "region": "Massachusetts",\n "country": "US",\n "loc": "42.2038,-71.0022",\n "org": "AS7922 Comcast Cable Communications, Inc.",\n "postal": "02184"\n } """'; $find = array('"""', '\n', '{', '}'); $str = str_replace($find, '', $str); $str = str_replace('",', "-*-", $str); $str = explode("-*-", $str); $list[] = ""; for($i=0;$i<count($str);$i++) { $str_temp = str_replace('"', '', $str); $str_temp = explode(":", $str_temp[$i]); $str_temp[0] = str_replace("\n", "", $str_temp[0]); $str_temp[1] = str_replace("\n", "", $str_temp[1]); $list[trim($str_temp[0])] = $str_temp[1]; } echo $list['city']."<hr>"; echo $list['country']."<hr>"; echo $list['region']."<hr>"; echo $list['org']."<hr>"; var_dump($list); 

Например, $ list ['city'] вернет название города.