PHP cURL获取IP定位接口返回的复杂字符串如何转换为可读数组?
解决方法
你当前调用的ip-api.com/php/端点,返回的是PHP标准序列化格式的字符串,并不是需要手动拆分的复杂文本,直接用PHP内置的unserialize()函数就可以将其还原为结构化关联数组。
关键注意事项
- 不要尝试用
json_decode()处理该返回字符串:序列化格式和JSON格式完全不兼容,直接调用会返回空值,无法得到正确数据 - 如果需要跨语言兼容、更通用的返回格式,可以将接口URL后缀从
/php/改为/json/,此时返回的是标准JSON,用json_decode($响应内容, true)即可转换为数组
安全提示:
unserialize()仅适合处理来自可信第三方接口的固定结构返回内容,不要直接用来解析完全不可信的用户输入,避免潜在的反序列化安全风险。
修正后的完整可运行代码
function curl_get_contents($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); // 增加基础错误捕获,避免接口异常时无提示 if ($output === false) { curl_close($ch); return false; } curl_close($ch); return $output; } // 调用接口获取原始返回 $rawResponse = curl_get_contents("http://ip-api.com/php/" . $ip); if (!$rawResponse) { exit("IP地理信息接口请求失败"); } // 将序列化字符串转换为可读数组 $geoArray = unserialize($rawResponse); // 格式化输出查看结果 echo "<pre>"; print_r($geoArray); echo "</pre>";
转换后得到的数组结构
转换完成后,你可以通过数组键名直接读取对应信息,包括:
- 探测状态、所属国家/编码、区域/城市/邮编
- 经纬度、时区、ISP运营商、自治域信息
- 被探测的目标IP地址
可选优化方案
如果不依赖PHP专属的序列化格式,推荐改用JSON端点降低兼容风险:
// 替换为JSON格式的接口地址 $rawResponse = curl_get_contents("http://ip-api.com/json/" . $ip); // 转数组时第二个参数传true,确保返回关联数组而非stdClass对象 $geoArray = json_decode($rawResponse, true);
内容的提问来源于stack exchange,提问作者ynstsnr
相关产品推荐
相关产品推荐

