Я пытался понять и решить эту проблему без конца. Я думаю, что я близок в этом, я подозреваю, что я просто неправильно ссылаюсь на свои данные JSON, но я не могу понять, как сделать это правильно. Вот пример использования.
Я строю простую систему бухгалтерского учета для отслеживания крипто-транзакций. Система также подсчитывает общие суммы монет, рассчитывает стоимость монет в долларах США, рассчитывает общую стоимость портфеля и т. Д.
Я позволил пользователю отслеживать монеты по своему выбору, которые находятся в массиве под названием $ coins. Массив $ coins был инициализирован ранее в моем коде через вызов базы данных и содержит $ coin-> ID и символ $ coin->.
Чтобы определить стоимость монет в долларах США, я обращаюсь к CryptoCompare с помощью их API, который после получения символов монет из моего массива $ coins выглядит примерно так:
https://min-api.cryptocompare.com/data/pricemulti?fsyms=ADA,BTC,ETH,LTC&tsyms=USD
Просто вставьте этот URL в браузер, чтобы просмотреть результаты задавать.
$ price_request_data хранит эти данные после декодирования.
Теперь моя проблема возникает, когда я пытаюсь ссылаться на данные JSON через мой цикл $ coins. Я могу просто ссылаться на данные, если использую прямую ссылку, такую как:
$price_request_data->BTC->USD
Это дает значение 15592.
Но, очевидно, я хочу пройтись по циклу $ coins и динамически создавать переменные для каждой монеты, чтобы она соответствовала своей цене. Когда я пытаюсь ссылаться на данные JSON таким образом, он не может получить цену (15592) и вместо этого возвращает 0.
// ----------------------------------------------------------
// GET CURRENT PRICES
$apiurl = "https://min-api.cryptocompare.com/data/pricemulti?fsyms=ADA,BTC,ETH,LTC&tsyms=USD";
$price_request = wp_remote_get( $apiurl );
if( is_wp_error( $price_request ) ) {
return false;
}
$price_request_body = wp_remote_retrieve_body( $price_request );
$price_request_data = json_decode( $price_request_body );
if( ! empty( $price_request_data ) ) {
echo $price_request_data->BTC->USD . "<br />"; // PRODUCES 15592
foreach( $coins as $coin ) {
$pricereqdata = "price_request_data->" . $coin->symbol . "->USD";
echo $$pricereqdata; // PRODUCES 0
// Generate the variable name string i.e. "curpricebtc"$curprice = "curprice" . strtolower( $coin->symbol );
// Format the current coin's price
$$curprice = number_format( ceil_dec( $$pricereqdata, 2 ), 2, ".", "" );}
}
Это переменная типа $ price_request_data:
object(stdClass)#1527 (4) {
["ADA"]=>
object(stdClass)#1528 (1) {
["USD"]=>
float(0.4469)
}
["BTC"]=>
object(stdClass)#1535 (1) {
["USD"]=>
float(15592)
}
["ETH"]=>
object(stdClass)#1536 (1) {
["USD"]=>
float(757.13)
}
["LTC"]=>
object(stdClass)#1539 (1) {
["USD"]=>
float(291.21)
}
}
Я использую PHP7 и знаю, что некоторые справочные правила изменились, но я не смог определить, является ли это моей проблемой. Клянусь, я просто ссылаюсь на нее с помощью переменной переменной, но у меня недостаточно опыта, чтобы понять почему.
Любая мудрость высоко ценится.
ХОРОШО:
Q: Соответствует ли $ price_request_data {"ADA":{"USD":0.4738},"BTC":{"USD":15486.46},"ETH":{"USD":786.47},"LTC":{"USD":306.48}}
(или эквивалент)?
<= Ваш комментарий «// РАБОТАЕТ» подразумевает «да»
Q: Где инициализируется «$ coin»? Какова его ценность?
Q: Что такое значение «$ pricereqdata»?
В: Создает ли $$ pricereqdata новую переменную для вас? Что это? Какова его ценность?
Другими словами, что именно вы подразумеваете под «// FAILS» ???
Других решений пока нет …