如何在PHP数组中添加来自父级的值?

如何在PHP数组中添加来自父级的值?,php,arrays,Php,Arrays,我从CSV文件中读取流程成本,如下所示: Process Parent Cost Total_Cost 1 5 5 2 11 11 3 2 2 13 (2+11) 4 3 4 17 (4+2+11) 5 1 3 8 (3+5) 第四列不在CSV

我从CSV文件中读取流程成本,如下所示:

Process    Parent    Cost    Total_Cost
1                    5       5
2                    11      11
3          2         2       13 (2+11)
4          3         4       17 (4+2+11)
5          1         3       8 (3+5)
第四列不在CSV文件中,我需要通过添加家长成本来计算它

我将列读入多维数组,如下所示

Array (
...
[3] => Array ('Parent' => 2, 'Cost' => 2),
[4] => Array ('Parent' => 3, 'Cost' => 4),
...
);
我知道我应该迭代数组以获得父成本并将其添加到流程成本中。但这不是获取父级成本的正确数组结构


你能给我一个关于我的数组结构应该是什么的提示吗?

一个简单的方法是不必在最后计算计时,而是在读取文件时进行计算。每次读取一行时,构建数据,然后将其与总成本一起存储在由进程号索引的数组中。然后,当您找到具有父项的行时,查找父项行并将父项的总成本添加到新成本中

$fileName = "a.csv";
$timings = [];
$fh = fopen( $fileName, "r" );
// Read the header
$headers = fgetcsv($fh);
while ( $process = fgetcsv($fh) )   {
    // Add keys
    $newTimings = array_combine($headers, $process);
    $totalCost = $process[2];
    if ( !empty($process[1]) )  {
        $totalCost += $timings[$process[1]]["Total_Cost"] ?? 0;
    }
    $newTimings["Total_Cost"] = $totalCost;
    $timings[$process[0]] = $newTimings;
}
print_r($timings);
这将生成(使用问题中的测试数据)


一个简单的方法是不必在最后计算计时,而是在读取文件时进行计算。每次读取一行时,构建数据,然后将其与总成本一起存储在由进程号索引的数组中。然后,当您找到具有父项的行时,查找父项行并将父项的总成本添加到新成本中

$fileName = "a.csv";
$timings = [];
$fh = fopen( $fileName, "r" );
// Read the header
$headers = fgetcsv($fh);
while ( $process = fgetcsv($fh) )   {
    // Add keys
    $newTimings = array_combine($headers, $process);
    $totalCost = $process[2];
    if ( !empty($process[1]) )  {
        $totalCost += $timings[$process[1]]["Total_Cost"] ?? 0;
    }
    $newTimings["Total_Cost"] = $totalCost;
    $timings[$process[0]] = $newTimings;
}
print_r($timings);
这将生成(使用问题中的测试数据)


我认为使用一个简单的递归函数来计算成本是最简单的

function cost_recursive($process, $process_array) {
  if(empty($process_array[$process]['Parent']))
    return $process_array[$process]['Cost'];
  return $process_array[$process]['Cost'] + cost_recursive($process_array[$process]['Parent'], $process_array);
}

我认为使用一个简单的递归函数来计算成本是最简单的

function cost_recursive($process, $process_array) {
  if(empty($process_array[$process]['Parent']))
    return $process_array[$process]['Cost'];
  return $process_array[$process]['Cost'] + cost_recursive($process_array[$process]['Parent'], $process_array);
}

就我个人而言,我会用parent ID=array键构建数组,然后用子数组及其代价构建子数组,然后在ID=parent@treyBake你会如何处理多层次的父母(父母的父母)?父母可以达到多少层次?@treyBake实际上,不多,大约5级,但这是未知的。我个人会用父ID=数组键构建数组,然后用子数组及其代价构建子数组,然后在ID=parent@treyBake你会如何处理多层次的父母(父母的父母)?父母可以达到多少层次?@treyBake实际上,不多,大约5级,但这是未知的。