Я хотел напечатать название монеты (полученное из 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"
}
]
$array недоступен в function find(). Прочтите о область видимости переменной в PHP и забудьте все о $GLOBALS или global.
Я уже пробовал сделать $ coin [0] ['name'], но это не работает
Я также прошу вас прочитать об области видимости переменных в PHP, как ранее прокомментировал @axiac.






Пытаться:
$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 и после этого?
before bool (false) после NULL
Это проблема. file_get_contents () возвращает false, если не может найти ресурс, поэтому попробуйте изменить URL-адрес.
URL правильный, coinbase = "api.coinmarketcap.com/v1/ticker" array [1] = "/ ethereum" и сайт правильный api.coinmarketcap.com/v1/ticker/ethereum
@ be-sunny прав, вероятно, ошибка в том, что вы пытаетесь получить доступ к $array внутри функции.
Если я попробую так, я получу ответ. Я напечатал $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 Я получаю желаемый результат, а вы его не получаете? Возможно, file_get_content() не может получить данные за вас.
@ MONS7ER ясно вижу в моем фрагменте, что я сделал переменные $coinbase и $array локальными. В вашем случае $ array и $ coinbase недоступны в функции find (), так что внимательно проверьте
@ MONS7ER Я вижу, вы щелкаете, вы пропустили удаление переменных $coinbase и $array перед их использованием ... вот почему я сказал вам внимательно посмотреть мой фрагмент кода. Я просто сделал глобальную переменную локальной для упрощения использования, но вы полностью удалили ее :(
Я тоже не могу запустить его в функции и оставить полностью глобальным и т.д. Или я не прав?
@ MONS7ER ОК :) Я снова обновил свой ответ. Пожалуйста, посмотрите. В моем первом ответе я просто сделал его local для простоты. Теперь я делаю его похожим на ваш старый формат кода осциллографа global. Также призываю вас прочитать php.net/manual/en/language.variables.scope.php Сообщите мне, не работает он или нет?
Это не работает, и я сделал копипаст; будет проблема с хостингом или что-то в этом роде. На данный момент я не знаю, что делать, кроме как поблагодарить вас за потраченное время. Я перечитаю страницу, которую вы связали со мной в третий раз.
см. эту ссылку eval.in/971229 здесь также ответ пустой, потому что WARNING file_get_contents() has been disabled for security reasons on line number 7, поэтому он показывает только test
Значит, проблема не в коде, а в сайте, который дает мне json?
Нет, сайт отдает json отлично. это ваш код, который не может получить json с сайта. Если file_get_contents() не работает, вы можете попробовать curl. См. Ссылку stackoverflow.com/a/6724479/3723368
Установите error_reporting(~0); ini_set('display_errors', 1); в свой скрипт
Ваша полезная нагрузка имеет тип массива. Чтобы получить, например, первый элемент, вам понадобится что-то вроде $ coin [0] ['name'].