含嵌套数组的JSON序列化及SHA256哈希生成实现问题
解决PHP序列化嵌套数组并生成SHA256哈希UUID的问题
问题核心
你现有的zoza函数直接用echo输出序列化内容,没法把结果存到变量里做哈希计算,而且函数返回的$names根本没定义,逻辑存在缺陷。
修改后的序列化函数
把输出改成字符串拼接,递归时收集子结果,最终返回完整的序列化字符串,这样就能存入变量后续使用:
function zoza($arr) { $serialized = ''; foreach ($arr as $key => $val) { // 按伪代码要求把键转成大写,包裹双引号 $serialized .= '"' . strtoupper($key) . '"'; if (is_array($val)) { // 递归处理嵌套数组,把子结果拼入主字符串 $serialized .= zoza($val); } else { // 处理普通值,包裹双引号 $serialized .= '"' . $val . '"'; } } return $serialized; }
生成收据UUID(SHA256哈希)
拿到序列化字符串后,直接用PHP的hash函数生成64位十六进制的SHA256哈希:
// 替换成你的实际收据数组 $maArray = [ 'Receipt' => [ 'Id' => 'R20240501', 'Amount' => '150', 'Items' => [ ['Product' => 'Laptop', 'Price' => '120'], ['Product' => 'Mouse', 'Price' => '30'] ] ] ]; // 获取序列化后的单行文本 $serializedStr = zoza($maArray); // 生成64字符的十六进制SHA256哈希作为UUID $receiptUuid = hash('sha256', $serializedStr); // 测试输出 echo "序列化内容:" . $serializedStr . PHP_EOL; echo "收据UUID:" . $receiptUuid . PHP_EOL;
关键改动说明
- 移除所有
echo输出,改用$serialized变量拼接内容,确保结果可存入变量 - 修复原函数返回未定义变量的问题,直接返回完整的序列化字符串
- 严格遵循你提供的伪代码要求,将所有键转换为大写(使用
strtoupper($key)) - 递归处理嵌套数组时,将子数组的序列化结果拼接到主字符串,完全符合序列化规则
内容的提问来源于stack exchange,提问作者David Isaac
相关产品推荐
相关产品推荐

