#php #arrays #json #api
#php #массивы #json #API
Вопрос:
Начинающий PHP здесь. Я хочу отобразить сравниваемые данные ($ MyCoin) из JSON API, чтобы отображались только те элементы, которые я сначала вставил в массивы $ MyCoin, но я не могу понять, как заставить код работать одинаково с ИМЕНАМИ вместо ЧИСЕЛ.
Используемый API:
код:
<?php
//// API
$coinData = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,XRB,IOTA,XRP,XLM,TRX,LINKamp;tsyms=USD'), true);
// Arrays
$myCoins = array(
'BTC' => array ( 'balance' => 12.90 ),
'ETH' => array ( 'balance' => 122.23 ),
'XRB' => array ( 'balance' => 221.52 ),
'MIOTA' => array ('balance' => 233.00 ),
'XRP' => array ( 'balance' => 429.00 ),
'XLM' => array ( 'balance' => 1205.89 ),
'TRX' => array ( 'balance' => 5299.40 )
);
// Fetch the Coins
$numCoins = sizeof ($coinData['RAW']);
$portfolioValue = 0;
for ( $xx=0; $xx<$numCoins; $xx ) {
// Comparing to Data
$thisCoinSymbol = $coinData[$xx]['FROMSYMBOL'];
//
$coinHeld = array_key_exists($thisCoinSymbol, $myCoins);
// Only retour held
if ( !$coinHeld ) { continue; }
// names test:
echo $coinData[$xx]['FROMSYMBOL'];
};
?>
Руководство, которое я использовал, было сделано с использованием API, который отображает элементы в виде чисел, а не имен элементов, как в API, который я хочу использовать.
Обучающий API:
https://api.coinmarketcap.com/v1/ticker/
Итак, моя консоль выдает Undefined offset: 0
— Undefined offset: 7
on line $thisCoinSymbol = $coinData[$xx]['FROMSYMBOL']
; Я понимаю, что это потому, что $ xx равно 0 — 7, потому что в [‘RAW’] есть 8 элементов, а в API, который я использую, нет 0-7.
Как бы я получил тот же результат, что и в руководстве, но с API, который я хочу использовать?
Комментарии:
1. Было бы очень полезно, если бы вы могли показать нам данные JSON
Ответ №1:
Вы должны использовать foreach для анализа вашего json, который структурирован подобным образом:
RAW: {
BTC: {
USD: {
TYPE: "5",
MARKET: "CCCAGG",
FROMSYMBOL: "BTC",
....
}
},
ETH: {....},
...
}
Итак, ваш код должен выглядеть следующим образом:
<?php
$coinData = json_decode(file_get_contents('https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,XRB,IOTA,XRP,XLM,TRX,LINKamp;tsyms=USD'), true);
$myCoins = array(
'BTC' => array ( 'balance' => 12.90 ),
'ETH' => array ( 'balance' => 122.23 ),
'XRB' => array ( 'balance' => 221.52 ),
'MIOTA' => array ('balance' => 233.00 ),
'XRP' => array ( 'balance' => 429.00 ),
'XLM' => array ( 'balance' => 1205.89 ),
'TRX' => array ( 'balance' => 5299.40 )
);
$portfolioValue = 0;
// your information in json path ['RAW'] so safeguard here to be sure it exists
if (isset($coinData['RAW'])) {
// then loop on all entries $cryptoSymbol will contains for example BTC and cryptoInfo the array USD => [...]
foreach($coinData['RAW'] as $cryptoSymbol => $cryptoInfo) {
// safeguard, check path [USD][FROMSYMBOL] exists
if (!isset($cryptoInfo['USD']) || !isset($cryptoInfo['USD']['FROMSYMBOL'])) {
// log or do whatever to handle error here
echo "no path [USD][FROMSYMBOL] found for crypto: " . $cryptoSymbol . PHP_EOL;
continue;
}
// Your symbol in on your json path/array [USD][FROMSYMBOL]
$thisCoinSymbol = $cryptoInfo['USD']['FROMSYMBOL'];
$coinHeld = array_key_exists($thisCoinSymbol, $myCoins);
// Only retour held
if ( !$coinHeld ) { continue; }
echo $cryptoInfo['USD']['FROMSYMBOL'] . PHP_EOL;
}
}
?>
У вас будет вывод:
BTC ETH XRB XRP XLM TRX
Теперь вы можете правильно проанализировать json, вам должно быть легко создать ожидаемый json.
Взгляните на документ foreach здесь:https://www.php.net/manual/en/control-structures.foreach.php
Комментарии:
1. Большое вам спасибо, что нашли время и помогли мне, это именно то, чего я пытался достичь!
2. Я сделал, еще раз спасибо за вашу помощь. (Голосование не отображается, потому что я новичок в stackoverflow)