PHP调用CoinExchange API获取匹配MarketID及币种信息问题
解决方案:匹配CoinExchange API中的有效MarketID并输出交易对信息
需求回顾
从
https://www.coinexchange.io/api/v1/getmarketsummaries获取可用的MarketID,检查这些ID是否存在于https://www.coinexchange.io/api/v1/getmarkets接口返回结果中,若存在则输出对应的MarketAssetCode和BaseCurrencyCode。
原代码的问题点
你的代码逻辑方向是对的,但有个核心效率问题:每次遍历getmarketsummaries的结果时,都会重复调用一次getmarkets接口,这会触发大量不必要的API请求,不仅运行速度慢,还很容易触发平台的限流机制,导致请求失败。
优化后的代码
<?php include 'pappu.php'; // 先一次性获取所有市场数据,避免重复请求API $marketsGrab = ngegrab('https://www.coinexchange.io/api/v1/getmarkets'); $marketsJson = json_decode($marketsGrab); // 将市场数据整理成以MarketID为键的关联数组,方便后续快速匹配 $marketsMap = []; if ($marketsJson && isset($marketsJson->result)) { foreach ($marketsJson->result as $market) { $marketsMap[$market->MarketID] = [ 'asset' => $market->MarketAssetCode, 'base' => $market->BaseCurrencyCode ]; } } // 获取市场摘要数据 $summariesGrab = ngegrab('https://www.coinexchange.io/api/v1/getmarketsummaries'); $summariesJson = json_decode($summariesGrab); // 遍历摘要中的MarketID,匹配已缓存的市场数据 if ($summariesJson && isset($summariesJson->result)) { foreach ($summariesJson->result as $summary) { $marketId = $summary->MarketID; if (isset($marketsMap[$marketId])) { echo "MarketID: {$marketId}<br>"; echo "交易对: {$marketsMap[$marketId]['asset']}/{$marketsMap[$marketId]['base']}<br><br>"; } } } ?>
代码优化说明
- 减少API请求:仅调用两次API(一次获取全量市场数据,一次获取市场摘要),彻底避免了原代码中循环请求的低效问题
- 快速匹配:将
getmarkets的结果转成以MarketID为键的关联数组,后续匹配时直接通过键查找,时间复杂度从O(n)降到O(1),匹配速度大幅提升 - 增强鲁棒性:增加了API返回数据的存在性检查,避免因接口返回异常导致的脚本报错
- 优化输出格式:调整了输出内容的排版,让结果可读性更强
内容的提问来源于stack exchange,提问作者Praburam
相关产品推荐
相关产品推荐

