You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 21:15:00