如何用PHP移除JSON文件中非唯一用户对象并写入新数据?
嘿,我来帮你搞定这个JSON文件更新的问题!从你描述的情况来看,追加新记录没问题,但删除旧记录的逻辑出了状况,我猜大概率是在JSON解码、遍历匹配或者重新写入的环节踩了坑。
先给你一套经过验证的完整代码,直接就能用,后面再给你拆解关键细节:
// 当前用户ID(你的$uvon变量) $user_id = $uvon; // JSON文件路径 $filetxt_1 = 'users.json'; // 读取文件内容并转成关联数组(第二个true参数必须加!) $fileContent = file_get_contents($filetxt_1); $users = json_decode($fileContent, true); // 处理文件为空或JSON格式错误的情况,初始化空数组 if ($users === null) { $users = []; } // 过滤掉当前用户的旧记录 $updatedUsers = array_filter($users, function($user) use ($user_id) { return $user['user_id'] !== $user_id; }); // 准备你的新用户数据(替换成你实际的字段和值) $newUserData = [ 'user_id' => $user_id, 'username' => '新用户名', 'email' => 'user@example.com' // 其他需要的字段... ]; // 把新数据加入过滤后的数组 $updatedUsers[] = $newUserData; // 重新编码成JSON,保留美观格式+避免中文转义 $jsonOutput = json_encode($updatedUsers, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // 写入文件,覆盖原内容 file_put_contents($filetxt_1, $jsonOutput);
关键细节拆解(这几个点是你可能出错的地方):
- 一定要转成关联数组:
json_decode第二个参数传true,会把JSON对象转成PHP的关联数组,比操作stdClass对象灵活太多,不容易因为对象属性名写错出问题; - 用array_filter简化过滤逻辑:比起手动foreach,
array_filter可以更简洁地把匹配到用户ID的旧记录过滤掉,代码更清爽; - 处理异常情况:如果JSON文件是空的、格式错误,
json_decode会返回null,这时候要初始化空数组,避免后续遍历出错; - 写入时覆盖原文件:
file_put_contents默认就是覆盖写入,这样旧记录会被完全替换,不会残留; - JSON编码的参数:
JSON_PRETTY_PRINT让生成的JSON格式好看,方便调试;JSON_UNESCAPED_UNICODE避免中文被转成\uXXXX的格式。
额外提醒的坑:
- 确保JSON文件有读写权限,否则读或写操作会失败,可以用
chmod('users.json', 0644)调整权限; - 确认你的JSON文件初始结构是数组(比如
[]),如果一开始是单个对象,后续追加会出错; - 检查你的用户数据里的ID字段名是否和代码里的
user_id一致,别把字段名写成id或者其他名字,匹配不上就等于没删除旧记录。
内容的提问来源于stack exchange,提问作者Charles Raiser
相关产品推荐
相关产品推荐

