如何在 PHP 中动态构建包含多个 JSON 对象元素的嵌套结构

如何在 PHP 中动态构建包含多个 JSON 对象元素的嵌套结构

本文详解如何使用 php 动态解析含地理坐标字符串的原始 json 数据,并正确构建符合规范的嵌套 json 结构(如 {“routes”: [{…}, {…}]}),避免覆盖问题,确保每个路由对象独立添加。

在 PHP 中动态生成符合特定结构的 JSON 数据(尤其是含数组嵌套的对象)时,一个常见误区是反复赋值同一对象属性(如 $json->route_ID = …),导致前序数据被后序循环覆盖——这正是原代码仅输出 “route_ID”: “50” 的根本原因。

关键在于:Routes 必须是一个数组,且每次循环应向该数组追加一个全新的路由对象,而非复用并重写同一个对象实例。

以下是修正后的完整实现逻辑(已优化健壮性与可读性):

147.499935,-30.63607 "},{"route_ID":"50","geom":"147.499935,-30.63607"}]';

// 1. 解码原始 JSON 字符串为关联数组
$jsonArray = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    throw new RuntimeException('Invalid input JSON string');
}

// 2. 初始化最终结构:Routes 作为空数组
$result = new stdClass();
$result->Routes = []; // ✅ 核心修正:声明为数组

// 3. 遍历每条路由记录
foreach ($jsonArray as $record) {
    // 提取并清洗 geom 坐标字符串
    $geomString = $record['geom'] ?? '';
    $geomString = preg_replace('/|/i', '', $geomString);
    $geomString = trim($geomString);

    // 解析坐标对(支持空格/换行分隔)
    $coords = preg_split('//s+/', $geomString, -1, PREG_SPLIT_NO_EMPTY);
    $geomPoints = [];

    foreach ($coords as $coord) {
        $parts = array_map('trim', explode(',', $coord));
        if (count($parts) >= 2) {
            // 注意:GeoJSON 和地图 API 通常为 [lng, lat],此处按需求转为 {lat, lng}
            $geomPoints[] = [
                'lat' => $parts[1],
                'lng' => $parts[0]
            ];
        }
    }

    // 4. 构建单个路由对象(全新 stdClass 实例)
    $route = new stdClass();
    $route->route_ID = $record['route_ID'] ?? '';
    $route->geom = $geomPoints;

    // 5. ✅ 追加到 Routes 数组(非赋值!)
    $result->Routes[] = $route;
}

// 6. 输出标准化 JSON(带缩进便于调试)
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
?>

输出示例:

TicNote

TicNote

出门问问推出的Agent AI智能硬件

下载

立即学习PHP免费学习笔记(深入)”;

{
    "Routes": [
        {
            "route_ID": "49",
            "geom": [
                {
                    "lat": "-30.63607",
                    "lng": "147.499935"
                }
            ]
        },
        {
            "route_ID": "50",
            "geom": [
                {
                    "lat": "-30.63607",
                    "lng": "147.499935"
                }
            ]
        }
    ]
}

注意事项:

  • 始终使用 [] 向数组追加元素($array[] = $item),而非重复赋值同名属性;
  • 使用 preg_replace 替代多次 str_replace,提升坐标清洗鲁棒性;
  • 添加 json_last_error() 检查,避免静默失败;
  • 若输入坐标含多点(如 “147.1, -30.1 147.2, -30.2″),preg_split(‘//s+/’, …) 可可靠分割;
  • 如需兼容更复杂 KML/GPX 输入,建议引入专用 XML 解析器(如 SimpleXML),而非正则硬解析。

通过结构化初始化 + 循环追加模式,即可稳定生成任意数量的嵌套 JSON 对象,完美适配地图 API、前端组件等消费场景。

https://www.php.cn/faq/2037706.html

发表回复

Your email address will not be published. Required fields are marked *