直接用 serialize() 作缓存键会导致语义等价数组生成不同 key,因它保留键顺序、类型细节且跨版本不一致;应改用 json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_SORT_KEYS) 并预处理浮点精度、null/空字符串及非标值。
serialize() 不适合做缓存键直接对二维数组用 serialize() 生成字符串当缓存 key,看似简单,但实际会踩坑:键长不可控、可读性差、不同 PHP 版本或扩展(如 OPcache)下序列化结果可能不一致,更严重的是 serialize() 保留数组键顺序和类型细节(比如 0 和 "0" 序列化结果不同),导致逻辑上等价的数组生成不同 key。
真正需要的是「语义等价即 key 等价」——只要数组内容相同(忽略键顺序、浮点精度微差、null/"" 差异等),就应生成同一 key。
json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_SORT_KEYS) 更稳妥:强制键排序、统一编码、丢弃非标类型(如 resource、closure)round($val, 6) 统一精度,再 json 编码array_map(fn($v) => $v === null ? '' : $v, $arr) 归一化遇到 json_encode() 报错 
TypeError: json_encode(): Type is not supported,说明数组里混进了对象、资源或闭包。这类值无法直接参与缓存 key 构建,必须显式剥离或替换。
array_walk_recursive() 遍历并检测类型:is_object($v) || is_resource($v) || is_callable($v)
'[object]'、'[resource]',避免 key 泄露敏感结构__toString() 或含 id 属性),提取该字段代替整个对象var_export() 或 print_r(),它们输出含空格/换行,且格式不稳定md5(json_encode(...)) 是不是最优解?加 md5() 是为了缩短 key 长度,但要注意:MD5 碰撞概率虽低,但在海量缓存场景下不能完全忽略;更重要的是,它把调试成本变高了——你再也无法从 key 反推原始数据结构。
json_encode(...) 原始字符串,便于日志排查和人工验证md5() 或 spl_hash()
sha1()——它比 md5 长且无实际安全增益;也不要自己拼接字符串(如 $a.'|'.$b),易被注入分隔符干扰JSON_UNESCAPED_UNICODE,禁用 JSON_UNESCAPED_SLASHES,否则斜杠转义差异会导致哈希不一致array_key_first() 和降维无关,别误用看到“降维”就想到 array_keys() 或 array_values() 是常见误解。二维数组转一维 key 的本质是「扁平化语义」,不是「提取某一层键」。像 array_key_first()、array_column() 这类函数只操作单层结构,对嵌套数组无效。
['user']['name'] → 'user.name'),得递归遍历 + 拼接,但这样生成的 key 无法还原原结构,仅适用于固定 schema 场景array_map() 提取子集,再 encode,而不是对整个二维数组硬降维