【问题标题】:Compare Data from JSON API thats not listed in numbers format比较 JSON API 中未以数字格式列出的数据
【发布时间】:2019-03-29 13:07:20
【问题描述】:

这里是 PHP 初学者。 我想显示来自 JSON API 的比较数据 ($myCoins),以便只显示我第一次插入 $myCoins 数组的那些项目,但我不知道如何让代码进行相同的操作NAMES 而不是 NUMBERS。

使用的 API:

https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC,ETH,XRB,MIOTA,XRP,XLM,TRX&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,LINK&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/

所以我的控制台在$thisCoinSymbol = $coinData[$xx]['FROMSYMBOL'] 上输出了一个Undefined offset: 0 - Undefined offset: 7;我理解这是因为$xx等于0-7,因为['RAW']下有8个Item,而我使用的API中没有0-7。

如果使用我想使用的 API,我如何获得与教程相同的结果?

【问题讨论】:

  • 如果您能向我们展示 JSON 数据,将会很有帮助

标签: php arrays json api


【解决方案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,LINK&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;
 }
}
?>

你会得到输出:

比特币 以太坊 XRB 瑞波币 XLM TRX

现在你可以用正确的方式解析 json,构建预期的 json 应该很容易。

在这里查看 foreach 文档:https://www.php.net/manual/en/control-structures.foreach.php

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我,这正是我努力实现的目标!
  • 我做到了,再次感谢您的帮助。 (投票没有显示,因为我是 stackoverflow 的新手)
猜你喜欢
  • 2021-11-04
  • 2021-03-18
  • 2022-01-16
  • 2021-08-07
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2015-06-26
相关资源
最近更新 更多