2012-04-10 7 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) { 
     } 
     } 

Если узел имеет дочерние элементы, то индекс «дети» будет иметь вложенный массив, содержащий значения. Вопрос здесь в том, как я могу суммировать все значения в индексе «suma» для каждого ребенка с учетом «guid»?

Например, данный guid c7bc90c45a5319a00f8a64c7ae1a5ca9 должен возвращать значение 111035.3800, поскольку у этого поддерева нет детей. Но с c0227d82bf3926d0517a0cffce66be31 функция должна суммировать Null + 111035.3800 + 0.0000, которые являются значениями в индексе «suma» для данного guid и его дочерних элементов. Если узел имеет «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

Спасибо, только для записи мне пришлось использовать mySQL-функцию «COALESCE» в запросе, который вызывает дерево, чтобы избежать значений NULL в индексе «suma», –

1

Ваша проблема заключается в определении функции. Вы не решили, что будет делать ваша функция.

Если ответ на этот вопрос «много вещей», то у вас есть проблема. В вашем случае у вас есть «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, имя, parent guid и suma для родительского узла. Я хочу показать имя родителя и сумму для родителя и всех детей. –

Смежные вопросы