2014-03-05 25 views
2

我有一個關聯數組,它是我從下面的代碼的ODBC查詢創建:應用array_map遞歸(array_walk_recursive?)

 while ($row=odbc_fetch_array($oexec)) { 
     if(empty($group[$row['gmm']])) { 
      $group[$row['gmm']] = array(); 
     } 
     if(empty($group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']])) { 
      $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']] = array(); 
     } 
     if(empty($group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']])) { 
      $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']] = array(); 
     } 
     if(empty($group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']])) { 
      $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']] = array(); 
     } 
     if(empty($group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']])) { 
      $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']] = array(); 
     } 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['total_ty_yest_sales'] = $row['total_ty_yest_sales']; 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['total_wo_dotcom_ty_yest_sales'] = $row['total_wo_dotcom_ty_yest_sales']; 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['east_ty_yest_sales'] = $row['east_ty_yest_sales']; 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['central_ty_yest_sales'] = $row['central_ty_yest_sales']; 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['west_ty_yest_sales'] = $row['west_ty_yest_sales']; 
     $group[$row['gmm']][$row['acctg_dept_nbr'] . " - " . $row['acctg_dept_desc']][$row['dept_catg_grp_desc']][$row['dept_category_desc']][$row['dept_subcatg_desc']]['dotcom_ty_yest_sales'] = $row['dotcom_ty_yest_sales']; 

    } 

這給了我一個數組,其中:

$myArray = Array(GMM => Array(acctg_dept_nbr => Array(dept_category_desc => Array(dept_subcatg_desc => Array(value1,value2,value3))))) 

我想總結每個級別的價值。因此,對於每個acctg_dept_nbr [dept_category_desc] [dept_subcatg_desc],我想總結value1,value2,value3。 GMM級別和dept_subcatg_desc級別相同。總結dept_subcatg_desc級別不是問題。我挖了一遍,發現如何總結dept_category_desc級別,但無法遞歸地應用該方法。

這裏是放值到一個表的代碼:

foreach($group as $gmm => $acctg_dept_nbrs) { 
     echo "<tr class=\"header\"> 
     <td>" . $gmm . "</td>\n"; 

     foreach ($acctg_dept_nbrs as $acctg_dept_nbr => $dept_catg_grp_descs) { 
         echo "<tr class=\"header\">\n 
      <td style=\"padding-left: 1em;\">" . $acctg_dept_nbr . "</td>\n"; 

      foreach($dept_catg_grp_descs as $dept_catg_grp_desc => $dept_category_descs) { 
       echo "<tr class=\"header\">\n 
       <td style=\"padding-left: 2em;\">" . $dept_catg_grp_desc . "</td>\n"; 
            //echo "<td>" . array_sum(array_walk_recursive($dept_category_descs,function($item) {return $item['total_ty_yest_sales'];})) . "</td>"; 
       foreach($dept_category_descs as $dept_category_desc => $dept_subcatg_descs) { 
        echo "<tr class=\"header\">\n 
        <td style=\"padding-left: 3em;\">" . $dept_category_desc . "</td>\n"; 
              echo "<td>" . array_sum(array_map(function($item) {return $item['total_ty_yest_sales'];},$dept_subcatg_descs)) . "</td>"; 
              echo "<td>" . array_sum(array_map(function($item) {return $item['east_ty_yest_sales'];},$dept_subcatg_descs)) . "</td>"; 
              echo "<td>" . array_sum(array_map(function($item) {return $item['central_ty_yest_sales'];},$dept_subcatg_descs)) . "</td>"; 
              echo "<td>" . array_sum(array_map(function($item) {return $item['west_ty_yest_sales'];},$dept_subcatg_descs)) . "</td>"; 
        foreach($dept_subcatg_descs as $dept_subcatg_desc => $values) { 
               echo "<tr>\n 
                <td style=\"padding-left: 4em;\">" . $dept_subcatg_desc . "</td>\n"; 
               $sum = $values['total_ty_yest_sales']; 
               echo "<td>".$sum."</td>"; 
               $sum = $values['east_ty_yest_sales']; 
               echo "<td>".$sum."</td>"; 
               $sum = $values['central_ty_yest_sales']; 
               echo "<td>".$sum."</td>"; 
               $sum = $values['west_ty_yest_sales']; 
               echo "<td>".$sum."</td>"; 
        } 
       } 
      } 
     } 
    } 

註釋掉線的問題,我現在。此:

array_sum(array_map(function($item) {return $item['west_ty_yest_sales'];},$dept_subcatg_descs)) 

在該級別上正常工作,但不在較高級別。我也試圖調整這一功能無濟於事:

function array_map_recursive($callback, $array) { 
    foreach ($array as $key => $value) { 
     if (is_array($array[$key])) { 
      $array[$key] = array_map_recursive($callback, $array[$key]); 
     } 
     else { 
      $array[$key] = call_user_func($callback, $array[$key]); 
     } 
    } 
    return $array; 
} 

我怎樣才能使這項工作,這樣不管它會向下挖掘,總結了值數組的那部分的水平?

+0

你確定你的回調函數正在返回一個值嗎?這個遞歸函數似乎沒有任何問題。 –

+0

如果我使用:array_sum(array_map_recursive(function($ item){return $ item ['total_ty_yest_sales'];},$ dept_category_descs)) 我得到一個非法的字符串偏移錯誤。回調在這裏工作: array_sum(array_map(function($ item){return $ item ['total_ty_yest_sales'];},$ dept_subcatg_descs)) – user3352316

+0

您將匿名/ lambda函數作爲字符串傳入您的回調參數,因此call_user_func獲勝不會像這樣工作,因爲它會嘗試調用一個名爲'function($ item){...}的函數「,您應該單獨定義您的回調函數,並將其名稱傳入。 –

回答

11
function array_map_recursive($callback, $array) 
{ 
    $func = function ($item) use (&$func, &$callback) { 
    return is_array($item) ? array_map($func, $item) : call_user_func($callback, $item); 
    }; 

    return array_map($func, $array); 
} 
+0

輝煌的解決方案,謝謝:) – simonhamp