2012-04-10 10 views
1

私は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では、関数は、指定されたguidとその子のインデックス "suma"の値であるNull + 111035.3800 + 0.0000を加算する必要があります。ノードに「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; 
    } 

すべてのヘルプは、あなたの問題は、あなたの関数定義であるおかげ

答えて

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"); 
+0

ありがとう、ちょうどレコードのために、インデックス "suma"のNULL値を避けるためにツリーを呼び出すクエリでmySQL関数 'COALESCE'を使用しなければなりませんでした。 –

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!!! 
} 
+0

こんにちは@Nathanielを私は合計値をしたいだけでなく、GUID、親ノードの名前、親guid、およびsuma。私は親の名前と親とすべての子の合計を表示したい。 –

関連する問題