【问题标题】:Get sum from nested arrays从嵌套数组中获取总和
【发布时间】:2012-04-10 02:15:03
【问题描述】:

我在PHP中有一个由数组组成的树形结构,这些树形结构如下。

 array(5) {
["guid"]=>
string(32) "bfd08465daebc6a624f81fb38fdcb357"
["name"]=>
string(7) "Activos"
["parent_guid"]=>
string(32) "3caed17eb39d20aa9d409f2e61d457ff"
["suma"]=>
NULL
["children"]=>
array(1) {
  [0]=>
  array(5) {
    ["guid"]=>
    string(32) "c0227d82bf3926d0517a0cffce66be31"
    ["name"]=>
    string(14) "Current Assets"
    ["parent_guid"]=>
    string(32) "bfd08465daebc6a624f81fb38fdcb357"
    ["suma"]=>
    NULL
    ["children"]=>
    array(3) {
      [0]=>
      array(5) {
        ["guid"]=>
        string(32) "c7bc90c45a5319a00f8a64c7ae1a5ca9"
        ["name"]=>
        string(16) "Cuenta de ahorro"
        ["parent_guid"]=>
        string(32) "c0227d82bf3926d0517a0cffce66be31"
        ["suma"]=>
        string(11) "111035.3800"
        ["children"]=>
        array(0) {
        }
      }
      [1]=>
      array(5) {
        ["guid"]=>
        string(32) "72a3ed3467cfd24671197ad7d7f9bb40"
        ["name"]=>
        string(17) "Cuenta de cheques"
        ["parent_guid"]=>
        string(32) "c0227d82bf3926d0517a0cffce66be31"
        ["suma"]=>
        string(6) "0.0000"
        ["children"]=>
        array(0) {
        }
      }

如果一个节点有子节点,那么索引“children”将有一个包含值的嵌套数组。这里的问题是,如何为给定“guid”的每个孩子将索引“suma”中的所有值相加?

例如,给定 guid c7bc90c45a5319a00f8a64c7ae1a5ca9,该函数必须返回 111035.3800,因为该子树没有子树。但是对于 c0227d82bf3926d0517a0cffce66be31,该函数必须将 Null + 111035.3800 + 0.0000 相加,这是给定 guid 及其相应子项的索引“suma”中的值。如果一个节点有“n”个嵌套的子节点,那么该函数应该遍历所有子节点并对索引“suma”中的值求和。

我已经有一个递归函数,它返回一个给定 guid 值的子树,但我不知道如何计算总和。

function getChildrenAccounts($array, $parent_guid)
  {
    if(!is_array($array))
      return null;
    if(isset($array['guid']) && $array['guid'] == $parent_guid)
      return $array['children'];
    foreach ($array as $item) {
        $return = $this->getChildrenAccounts($item, $parent_guid);
      if (!is_null($return)) 
        return $return;
    }
    return null;
  }

任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: php multidimensional-array tree


    【解决方案1】:

    您的问题在于您的函数定义。你还没有决定你的函数会做什么。

    //What is the return value here?
    function getChildrenAccounts($array, $parent_guid) {
    

    如果答案是“很多事情”,那么您就有问题了。在您的情况下,您有“null”、一个数组,可能还有一个值(“suma”字段的总和)。

    我建议写一个函数:

    function sumChildrenAccounts($array, $parent_guid, &$sum) {
      if(!is_array($array)) { return null; }//this needs to be caught as an error!
      if(isset($array['guid']) && $array['guid'] == $parent_guid) { //a valid array
        foreach ($array['children'] as $child) {
          $sum = $this->sumChildrenAccounts($child, $parent_guid, $sum) + $array['suma'];
        }
        return $sum;
      }
      return null;//also an error!!!
    }
    

    【讨论】:

    • 嗨@Nathaniel 我想要总和值,还想要父节点的 guid、名称、父 guid 和 suma。我想显示父母的姓名以及父母和所有孩子的总和。
    【解决方案2】:

    代码:

    function getChildrenSum($array)
    {
        $sum = 0;
    
        if (count($array)>0)
        {
            foreach ($array as $item)
            {
                $sum += $item['suma'];
                $sum += getChildrenSum($item['children']);
            }
        }
        else return 0;
    }
    
    function getSumFromArray($array,$guid)
    {
        foreach ($array as $item)
        {
            if (isset($item['guid']))
                if ($item['guid']==$guid)
                    return getChildrenSum($item['children']);
        }
    
        return 0;
    }
    

    用法:

    $total = getSumFromArray($array,"c0227d82bf3926d0517a0cffce66be31");
    

    【讨论】:

    • 谢谢,为了记录,我不得不在查询中使用 mySQL 函数 'COALESCE' 来显示树以避免索引“suma”中的 NULL 值
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2022-10-24
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多