不是必须用 array_walk_recursive,因其会丢失节信息;需手动遍历保留节名与层级,注意键名清洗、换行规范及 parse_ini_file(true) 读取嵌套。
PHP嵌套数组转INI:必须用 array_walk_recursive 吗?
不是必须,但直接用它会丢节(section)信息。INI 文件的节名(如 [database])在嵌套数组里通常对应一级键,而 array_walk_recursive 会扁平化所有层级,无法还原结构。真正要保留节和子键层级,得手动遍历,不能偷懒。
常见错误是把 ['db' => ['host' => '127.0.0.1']] 传给 array_walk_recursive,结果写出来变成 host = "127.0.0.1",完全丢失 [db] 节。
- 一级键视为节名(除非值不是数组,此时应跳过或报错)
- 二级及以下键按点号拼接(如
db.host),或保持缩进层级(需手动控制) - 空数组、
null值建议跳过,INI 不支持原生空节或空值语义
写入时如何正确处理节名和键名中的特殊字符
INI 节名和键名本身不支持方括号、等号、分号、空格等字符,但 PHP 数组键可以含这些。如果原始数组键是 "user.name" 或 "cache ttl",直接写入会导致解析失败或行为异常。
稳妥做法是:对节名和键名做最小化清洗,只保留字母、数字、下划线、连字符;遇到非法字符统一替换为下划线,或抛出警告。不要自动加引号——INI 标准不承认键名引号("user.name" = value 是无效语法)。
立即学习“PHP免费学习笔记(深入)”;