如何从多维数组中返回完整路径及其对应哈希值?
解决方案
要生成多维数组/对象中每个完整路径对应的哈希值,你需要在递归过程中跟踪当前的路径前缀,这样才能拼接出从根节点到当前节点的完整路径。这里是修改后的函数:
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; }
关键修改点
- 跟踪完整路径:新增
$currentPath参数,递归时拼接当前节点的键,生成从根到当前节点的完整路径(比如c.d.1)。 - 准确计算数组/对象的哈希:原函数直接拼接数组/对象会得到
Array或Object字符串,哈希完全不准确。这里用serialize()序列化整个节点内容,确保哈希能反映节点的真实数据。 - 合并递归结果:将子节点的处理结果合并到最终数组,确保所有层级的节点(从根到叶子)都被包含为独立条目。
- 保持原数据类型:不管是数组还是对象,都保留原类型,和你原函数的行为一致。
测试示例
用你给出的测试数组:
$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
相关产品推荐
相关产品推荐

