
本文讲解如何使用 PHP 安全、准确地更新 JSON 文件中数组类型的字段(如 "IdList": [10, 30, 70]),避免因类型误判导致 JSON 结构损坏(如将数组错误转为字符串)。核心在于将用户输入的逗号分隔字符串正确解析为整数数组。
本文讲解如何使用 PHP 安全、准确地更新 JSON 文件中数组类型的字段(如 `"IdList": [10, 30, 70]`,避免因类型误判导致 JSON 结构损坏(如将数组错误转为字符串)。核心在于将用户输入的逗号分隔字符串正确解析为整数数组。
在处理 JSON 配置文件时,直接将用户输入赋值给数组字段(如 IdList)极易引发类型错误:PHP 默认将 GET 参数(如 ?string=70,80,90)视为字符串,若直接执行 $data['IdList'] = $_GET['string'],会导致原 JSON 数组被替换为字符串 "70,80,90",破坏数据结构与后续解析逻辑。
要正确还原为 JSON 数组 [70, 80, 90],需完成两个关键步骤:
- 分割字符串:用 explode(',', $commandline) 将 "70,80,90" 拆分为 ['70', '80', '90'];
- 转换类型:用 array_map('intval', ...) 将每个字符串元素安全转为整数,得到 [70, 80, 90](注意:intval 可防御非数字输入,如 "70a" 会转为 70;如需严格校验,可配合 filter_var(..., FILTER_VALIDATE_INT))。
以下是修复后的完整示例代码:
<?php
// 获取并清理输入(防止空值或恶意字符)
$commandline = trim($_GET['string'] ?? '');
if (empty($commandline)) {
die('Error: "string" parameter is required.');
}
// 读取并解析 JSON 文件
$jsonContent = file_get_contents('file.json');
if ($jsonContent === false) {
die('Error: Failed to read file.json.');
}
$data = json_decode($jsonContent, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('Error: Invalid JSON in file.json.');
}
// 关键修复:将 "70,80,90" → [70, 80, 90]
$data['IdList'] = array_map('intval', explode(',', $commandline));
// 重新编码为格式化 JSON(可选:添加 JSON_PRETTY_PRINT 提高可读性)
$jsonContent = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
if ($jsonContent === false) {
die('Error: Failed to encode JSON.');
}
// 写入文件并反馈
if (file_put_contents('file.json', $jsonContent) === false) {
die('Error: Failed to write to file.json.');
}
echo 'success';
?>注意事项:
- ✅ 始终验证 json_decode() 和 json_encode() 的返回值,避免静默失败;
- ✅ 使用 trim() 和空值检查提升健壮性;
- ⚠️ 若用户可能提交负数或小数(如 -5,3.14),intval 会截断小数部分,此时应改用 floatval 或自定义解析逻辑;
- ? 生产环境务必对输入做白名单校验(如正则 /^-?\d+(,-?\d+)*$/),并考虑 CSRF 防护,避免开放 JSON 修改接口;
- ? 其他字段(如 isVisible、Name)为标量类型,可直接赋值;但所有数组字段均需按此模式解析,不可直接赋字符串。
通过以上方法,即可确保 IdList 等数组字段始终以合法 JSON 数组形式保存,维持数据完整性与系统稳定性。