2

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;
  }

助けていただければ幸いです、ありがとう

4

2 に答える 2

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!!!
}
于 2012-04-10T02:25:02.660 に答える
0

コード:

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");
于 2012-04-10T02:31:50.270 に答える