You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多维数组中返回完整路径及其对应哈希值?

解决方案

要生成多维数组/对象中每个完整路径对应的哈希值,你需要在递归过程中跟踪当前的路径前缀,这样才能拼接出从根节点到当前节点的完整路径。这里是修改后的函数:

function getFullPathHashes($tree, $currentPath = '') {
    $final = [];
    
    foreach ($tree as $key => $mixed) {
        // 拼接当前节点的完整路径(用`.`作为路径分隔符,可按需修改)
        $fullPath = $currentPath ? "{$currentPath}.{$key}" : $key;
        
        if (is_array($mixed) || is_object($mixed)) {
            // 对数组/对象序列化后计算哈希,确保内容一致时哈希一致
            $hash = md5($fullPath . serialize($mixed));
            // 保持原数据类型(数组或对象)
            $entry = [$key => $mixed];
            $final[] = [$hash => $entry];
            
            // 递归处理子节点,传递当前完整路径作为前缀
            $childResults = getFullPathHashes($mixed, $fullPath);
            $final = array_merge($final, $childResults);
        } else {
            // 普通值直接拼接路径和值生成哈希
            $hash = md5($fullPath . $mixed);
            $final[] = [$hash => [$key => $mixed]];
        }
    }
    
    return $final;
}

关键修改点

  1. 跟踪完整路径:新增$currentPath参数,递归时拼接当前节点的键,生成从根到当前节点的完整路径(比如c.d.1)。
  2. 准确计算数组/对象的哈希:原函数直接拼接数组/对象会得到Array或Object字符串,哈希完全不准确。这里用serialize()序列化整个节点内容,确保哈希能反映节点的真实数据。
  3. 合并递归结果:将子节点的处理结果合并到最终数组,确保所有层级的节点(从根到叶子)都被包含为独立条目。
  4. 保持原数据类型:不管是数组还是对象,都保留原类型,和你原函数的行为一致。

测试示例

用你给出的测试数组:

$new = [
    'a' => 'b',
    'c' => (object)[
        'd' => [1 => 11, 2 => 12],
        'f' => 'Hello',
    ],
];

$result = getFullPathHashes($new);
print_r($result);

输出会包含所有完整路径的条目,比如:

  • 根节点a的条目:哈希为md5("ab"),对应['a' => 'b']
  • 根节点c的条目:哈希基于完整路径c和序列化后的对象生成,对应['c' => 原对象]
  • 子节点c.d的条目:哈希基于c.d和序列化后的数组生成,对应['d' => [1 => 11, 2 => 12]]
  • 叶子节点c.d.1的条目:哈希为md5("c.d.111"),对应['1' => 11]
  • 叶子节点c.f的条目:哈希为md5("c.fHello"),对应['f' => 'Hello']

这样每个完整路径都有独立的哈希和条目,完全符合你的需求。

内容的提问来源于stack exchange,提问作者F.Ndr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:17:21