Сравнение данных из JSON API, которые не перечислены в формате numbers

#php #arrays #json #api

#php #массивы #json #API

Вопрос:

Начинающий PHP здесь. Я хочу отобразить сравниваемые данные ($ MyCoin) из JSON API, чтобы отображались только те элементы, которые я сначала вставил в массивы $ MyCoin, но я не могу понять, как заставить код работать одинаково с ИМЕНАМИ вместо ЧИСЕЛ.

Используемый API:

https://min-api.cryptocompare.com/data/pricemultifull ?fsyms = BTC, ETH, XRB, MIOTA, XRP, XLM, TRX amp; tsyms = USD

код:

 <?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)