Десериализовать ответ JSON (PHP)

Я хотел напечатать название монеты (полученное из JSON-ответа сайта) + «тест» при загрузке страницы; проблема в том, что печатается только «тест», как будто не нашел название монеты.

Код PHP:

<?php
     $coinbase = "https://api.coinmarketcap.com/v1/ticker";
     $array = array("/bitcoin","/ethereum");

     find();

     function find(){
         $coin = file_get_contents($GLOBALS["coinbase"].$array[1]);
         $coin = json_decode($coin, TRUE);
         $v = $coin['name']."test";
         echo $v;
     }
?>

Структура JSON:

[
   {
      id: "bitcoin-cash",
      name: "Bitcoin Cash",
      symbol: "BCH",
      rank: "4",
      price_usd: "1042.72",
      price_btc: "0.114721",
      24h_volume_usd: "462221000.0",
      market_cap_usd: "17742232718.0",
      available_supply: "17015338.0",
      total_supply: "17015338.0",
      max_supply: "21000000.0",
      percent_change_1h: "1.59",
      percent_change_24h: "-4.49",
      percent_change_7d: "-14.31",
      last_updated: "1520950752"
   }
]

Ваша полезная нагрузка имеет тип массива. Чтобы получить, например, первый элемент, вам понадобится что-то вроде $ coin [0] ['name'].

user991710 13.03.2018 16:44
$array недоступен в function find(). Прочтите о область видимости переменной в PHP и забудьте все о $GLOBALS или global.
axiac 13.03.2018 16:44

Я уже пробовал сделать $ coin [0] ['name'], но это не работает

MONS7ER 13.03.2018 16:58

Я также прошу вас прочитать об области видимости переменных в PHP, как ранее прокомментировал @axiac.

Always Sunny 13.03.2018 17:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
423
2

Ответы 2

Пытаться:

$coin = file_get_contents($GLOBALS["coinbase"].$array[1]);
$coin = json_decode($coin, TRUE);
$v = $coin[0]['name']."test";
echo $v;

Этот json представляет собой массив объектов, поэтому вы должны сначала получить доступ к индексу массива, а затем к свойству объекта.

РЕДАКТИРОВАТЬ

$coin = file_get_contents("https://api.coinmarketcap.com/v1/ticker/ethereum");

Попробуйте жестко запрограммировать URL-адрес, чтобы проверить его.

Переменная $coin пуста? Если нет, можете ли вы вставить var_dump($coin) перед тем, как попробовать json_decode и после этого?

legomolina 13.03.2018 16:53

before bool (false) после NULL

MONS7ER 13.03.2018 16:56

Это проблема. file_get_contents () возвращает false, если не может найти ресурс, поэтому попробуйте изменить URL-адрес.

legomolina 13.03.2018 16:57

URL правильный, coinbase = "api.coinmarketcap.com/v1/ticker" array [1] = "/ ethereum" и сайт правильный api.coinmarketcap.com/v1/ticker/ethereum

MONS7ER 13.03.2018 17:00

@ be-sunny прав, вероятно, ошибка в том, что вы пытаетесь получить доступ к $array внутри функции.

legomolina 13.03.2018 17:03

Если я попробую так, я получу ответ. Я напечатал $coin для вашего ясного понимания. Как вы можете легко получить доступ к 2D-массиву с его индексом 0 здесь.

  function find()
  {
    $coinbase = "https://api.coinmarketcap.com/v1/ticker";
    $array = array("/bitcoin","/ethereum");
    $coin = file_get_contents($coinbase.$array[1]);
    $coin = json_decode($coin, TRUE);
    //printing only for debug purpose 
    print '<pre>';
    print_r($coin);
    print '<pre>';
    $v = $coin[0]['name']."test";
    echo $v;
  }

  find();           

Выход:

Распечатайте его только для вашего ясного понимания, почему я использовал индекс $coin[0]['name'], чтобы получить имя из 2D-массива $coin.

Array
(
    [0] => Array
        (
            [id] => ethereum
            [name] => Ethereum
            [symbol] => ETH
            [rank] => 2
            [price_usd] => 687.193
            [price_btc] => 0.0760364
            [24h_volume_usd] => 1696390000.0
            [market_cap_usd] => 67457446384.0
            [available_supply] => 98163757.0
            [total_supply] => 98163757.0
            [max_supply] => 
            [percent_change_1h] => -0.63
            [percent_change_24h] => -2.36
            [percent_change_7d] => -16.98
            [last_updated] => 1520955853
        )

)

Это то что ты хочешь

Ethereumtest

N.B: Пожалуйста, обратите внимание на комментарий https://stackoverflow.com/users/4265352/axiac внимательно

$array is not accessible in function find(). Read about variable scope in PHP then forget everything about $GLOBALS or global

Согласно комментарию:

$coinbase = "https://api.coinmarketcap.com/v1/ticker";
$array = array("/bitcoin","/ethereum");
function find(){
    global $coinbase;
    global $array;
    $coin = file_get_contents($coinbase.$array[1]);
    $coin = json_decode($coin, TRUE);
    print '<pre>';
    print_r($coin);
    $v = $coin[0]['name']."test";
    echo $v;
}
find();

Протестировано и не работает. Я не знаю что делать.

MONS7ER 13.03.2018 16:53

Вы запускали мой фрагмент кода? @ MONS7ER Я получаю желаемый результат, а вы его не получаете? Возможно, file_get_content() не может получить данные за вас.

Always Sunny 13.03.2018 16:57

@ MONS7ER ясно вижу в моем фрагменте, что я сделал переменные $coinbase и $array локальными. В вашем случае $ array и $ coinbase недоступны в функции find (), так что внимательно проверьте

Always Sunny 13.03.2018 17:00

@ MONS7ER Я вижу, вы щелкаете, вы пропустили удаление переменных $coinbase и $array перед их использованием ... вот почему я сказал вам внимательно посмотреть мой фрагмент кода. Я просто сделал глобальную переменную локальной для упрощения использования, но вы полностью удалили ее :(

Always Sunny 13.03.2018 17:07

Я тоже не могу запустить его в функции и оставить полностью глобальным и т.д. Или я не прав?

MONS7ER 13.03.2018 17:15

@ MONS7ER ОК :) Я снова обновил свой ответ. Пожалуйста, посмотрите. В моем первом ответе я просто сделал его local для простоты. Теперь я делаю его похожим на ваш старый формат кода осциллографа global. Также призываю вас прочитать php.net/manual/en/language.variables.scope.php Сообщите мне, не работает он или нет?

Always Sunny 13.03.2018 17:19

Это не работает, и я сделал копипаст; будет проблема с хостингом или что-то в этом роде. На данный момент я не знаю, что делать, кроме как поблагодарить вас за потраченное время. Я перечитаю страницу, которую вы связали со мной в третий раз.

MONS7ER 13.03.2018 17:25

см. эту ссылку eval.in/971229 здесь также ответ пустой, потому что WARNING file_get_contents() has been disabled for security reasons on line number 7, поэтому он показывает только test

Always Sunny 13.03.2018 17:29

Значит, проблема не в коде, а в сайте, который дает мне json?

MONS7ER 13.03.2018 17:39

Нет, сайт отдает json отлично. это ваш код, который не может получить json с сайта. Если file_get_contents() не работает, вы можете попробовать curl. См. Ссылку stackoverflow.com/a/6724479/3723368

Always Sunny 14.03.2018 03:28

Установите error_reporting(~0); ini_set('display_errors', 1); в свой скрипт

Always Sunny 14.03.2018 03:32

Другие вопросы по теме