如何在 PHP 中动态构建包含多个对象元素的 JSON 结构
技术百科
花韻仙語
发布时间:2026-01-27
浏览: 次 本文详解如何使用 php 动态解析含地理坐标字符串的原始 json 数据,并将其转换为符合嵌套数组规范的标准化 json 格式,重点解决多路由对象的正确追加与结构组装问题。
在 PHP 中构建符合特定结构的 JSON 数据时,常见误区是反复覆写同一对象属性(如 $json->route_ID),导致最终仅保留最后一次循环的结果。要生成类似 {"Routes": [{...}, {...}]} 的多元素 JSON,关键在于:将 Routes 显式声明为数组,并在每次循环中向其追加一个独立的对象(而非覆盖)。
以下是修正后的完整实现逻辑:
$jsonString = '[{"route_ID":"49","geom":"147.499935,-30.63607 "},{"route_ID":"50","geom":"147.499935,-30.63607 "}]';
$jsonArray = json_decode($jsonString, true);
$json_Routes = new stdClass();
$json_Routes->Routes = []; // ✅ 关键:初始化为数组,支持多次 push
foreach ($jsonArray as $record) {
// 解析 geom 字段中的坐标字符串
$geomString = $record["geom"];
$geomString = preg_replace('/|<\/coordinates><\/LineString>/i', '', $geomString);
$geomString = 
trim($geomString);
$coords = array_filter(array_map('trim', explode(' ', $geomString)));
$route_geom = [];
foreach ($coords as $coord) {
if (strpos($coord, ',') !== false) {
[$lng, $lat] = array_map('trim', explode(',', $coord));
$route_geom[] = ['lat' => $lat, 'lng' => $lng]; // 注意:GeoJSON 习惯是 [lng, lat],此处按需求保留 lat/lng 键名
}
}
// 构建单个 route 对象(使用关联数组更直观,也可转为 stdClass)
$route = [
'route_ID' => $record['route_ID'],
'geom' => $route_geom
];
// ✅ 正确追加到 Routes 数组中
$json_Routes->Routes[] = $route;
}
// 输出标准 JSON(自动处理嵌套与转义)
echo json_encode($json_Routes, JSON_PRETTY_PRINT); 输出示例:
{
"Routes": [
{
"route_ID": "49",
"geom": [
{
"lat": "-30.63607",
"lng": "147.499935"
}
]
},
{
"route_ID": "50",
"geom": [
{
"lat": "-30.63607",
"lng": "147.499935"
}
]
}
]
}注意事项:
- 避免混用 stdClass 与数组操作;推荐统一使用关联数组([])构建结构,最后由 json_encode() 自动转换,语义更清晰、容错性更强;
- 坐标解析建议使用正则替代多次 str_replace,提升健壮性(如处理空格、换行、多余分隔符);
- 若输入中存在多组坐标(如 "147.499935,-30.63607 147.499868,-30.63631"),explode(' ', ...) 需配合 array_filter() 清除空元素;
- 最终调用 json_encode() 时可添加 JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT 提升可读性与中文兼容性。
通过明确数据容器类型(数组)、合理组织循环内对象构造,并利用 PHP 的动态数组追加机制([]),即可稳定、可扩展地生成任意数量嵌套 JSON 元素。
# 并在
# 也可
# 而非
# 关键在于
# 更强
# 按需
# 向其
# js
# json
# 路由
# 循环
# 对象
# 字符串
# php
# 如何使用
# 转换为
# 关联数组
# 多路
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Go 中实现 Python urllib.quot
- Windows 10怎么隐藏特定更新补丁_Wind
- Windows10怎么查看硬件信息_Windows
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- 如何从 Go 的 map[string]inter
- Win10如何更改任务栏高度_Windows10解
- Win11怎么关闭VBS安全性_Windows11
- PHP cURL GET请求:正确设置请求头与身份
- How to Properly Use NumPy
- 如何用正则表达式精确匹配“start”到“end”
- 如何使用Golang反射将map转换为struct
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Django 测试数据库表缺失与字段未创建问题的完
- Win11怎么设置任务栏对齐方式_Windows1
- PythonPandas数据分析教程_数据清洗与处
- windows 10应用商店区域怎么改_windo
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- C#如何使用XPathNavigator高效查询X
- Win11怎么设置任务栏大小_Windows11注
- Python大文件处理策略_内存优化说明【指导】
- c++ std::atomic如何保证原子性 c+
- Win11开机速度慢怎么优化_Win11系统启动加
- 如何使用Golang捕获并记录协程panic_保证
- c++怎么使用类型萃取type_traits_c+
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Windows11怎么用“记事本”自动换行与编码
- c++怎么使用std::unique实现去重_c+
- c# Task.ConfigureAwait(tr
- Win11怎么设置麦克风权限_允许应用访问Win1
- Python变量绑定机制_引用模型解析【教程】
- Python模块的__name__属性如何由导入方
- 如何在Golang中捕获JSON序列化错误_Gol
- Win11如何卸载OneDrive_Win11卸载
- Mac如何将HEIC图片格式转为JPG_Mac批量
- php高频调试功能有哪些_php常用调试函数与工具
- C#如何使用Channel C#通道实现异步通信
- 如何使用Golang处理静态文件缓存_提高页面加载
- Win11怎么更改电脑名称_Windows 11修
- 如何在Golang中实现自定义Benchmark_
- 如何在Golang中实现微服务负载均衡_Golan
- Win11如何更改任务栏颜色 Win11自定义任务
- 如何使用Golang读取日志文件_Golang b
- 如何使用Golang编写单元测试_创建Test函数
- Win11怎么关闭粘滞键_彻底禁用Windows
- 如何在Golang中捕获HTTP服务器错误_Gol
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- VSC怎么配置PHP的Xdebug_远程调试设置步
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- WindowsUSB驱动安装异常怎么办_USB驱动
- 如何在Golang中编写异步函数测试_Golang


QQ客服