PHP处理CSGO API JSON数据:拆分物品名与价格并更新MySQL
正确处理CSGOFast价格API数据,实现MySQL的新增与更新
你之前踩的坑其实很典型——没搞清楚API返回的JSON结构!这个接口返回的是以物品名称为键、价格为值的对象,不是嵌套数组,所以用explode(':')或者转CSV完全是走偏了,直接遍历这个对象的键值对就搞定了。
最优解决方案:直接遍历键值对 + 用updateOrCreate实现新增/更新
Laravel的Eloquent提供了updateOrCreate方法,完美适配你“新增插入、已有更新”的需求。直接上可用代码:
// 先确保API_URL已正确定义,比如: // define('API_URL', 'https://api.csgofast.com/price/all'); protected function populateItems() { // 把JSON转成关联数组(第二个参数传true),遍历起来更直观 $items = json_decode(file_get_contents(API_URL), true); // 遍历每个物品的名称和对应价格 foreach($items as $itemName => $price) { // updateOrCreate会自动判断:如果物品已存在就更新价格,不存在则新增记录 Item::updateOrCreate( ['name' => $itemName], // 查询条件:根据物品名称匹配已有记录 ['price' => $price] // 要写入的字段(新增或更新) ); } die('物品价格同步完成'); }
为什么你之前的方法失败了?
- 最初代码的问题:你用
json_decode得到的是stdClass对象,foreach($items as $item)里的$item其实只是价格值,不是包含名称和价格的数组,所以$i[0]和$i[1]根本不存在,自然取不到数据。 - 转CSV的问题:完全没必要这么做!物品名称里可能包含逗号、引号等特殊字符,转CSV会直接破坏原有结构,导致拆分出来的内容完全错误,反而把简单问题复杂化了。
额外优化:加上异常处理(避免脚本崩溃)
如果API请求失败或者JSON解析出错,脚本直接挂掉很不友好,加个异常捕获会更稳健:
protected function populateItems() { try { $response = file_get_contents(API_URL); if ($response === false) { throw new Exception('无法连接到CSGOFast价格API'); } $items = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('JSON解析失败:' . json_last_error_msg()); } foreach($items as $itemName => $price) { Item::updateOrCreate( ['name' => $itemName], ['price' => $price] ); } die('物品价格同步完成'); } catch (Exception $e) { die('同步失败:' . $e->getMessage()); } }
大数据量优化(可选)
如果接口返回的物品数量特别多(比如你提到的15k+),可以考虑批量处理减少数据库查询次数,比如用chunk或者批量插入更新,但对于大多数场景来说,上面的代码已经足够高效了。
内容的提问来源于stack exchange,提问作者Matheus Sartori
相关产品推荐
相关产品推荐

