2016-04-23 67 views
4

我一直在努力創造merge function多維數組全天。這個場景與用文字詳細說明有點不同,我會試着用實際的例子來解釋它。複雜的合併函數與PHP

$actual_array = [ 

    'assets' => [1, 2, 3], 
    'liabilities' => [1, 2, 3, 4, 5, 6], 
    'equity' => [1], 
    'income' => [1, 2, 3, 4], 
    'expenses' => [1, 2, 3] 
]; 

$merge = [ 
      'balance_sheet' => ['assets', 'liabilities', 'equity'], 
      'income' => ['income', 'expenses'], 
     ]; 

self::merge($merge, $actual_array); 

功能將合併列

public static function merge(array $merges, array $data) 
{ 
    $bigger_array_length = 0; 
    $arr = []; 
    $columns = []; 

    foreach ($merges as $key => $merge) { 

     foreach ($merge as $index => $column) { 

      //check which array has bigger length in the iteration 
      if($bigger_array_length < count($data[$column])) 
       $bigger_array_length = count($data[$column]); 

      $columns[] = $column; 

     } 
     //when i die and dump the columns array on its first iterate 
     dd($columns); // assets, liabilities, equity 
     if($bigger_array_length> 0) { 

      $total_columns = count($columns);// on first iteration 3 assets, liabilities and equity 
      for($i = 0; $i < $bigger_array_length; $i++) { 
       // 
       $arr[$key][] = [ 
         $columns[$total_columns - 1] => isset($data[ $columns[$total_columns - 1] ][$i]) ? $data[ $columns[$total_columns - 1] ][$i] : 0, 
         $columns[$total_columns - 2] => isset($data[ $columns[$total_columns - 2] ][$i]) ? $data[ $columns[$total_columns - 2] ][$i] : 0, 
         $columns[$total_columns - 3] => isset($data[ $columns[$total_columns - 3] ][$i]) ? $data[ $columns[$total_columns - 3] ][$i] : 0 
        ]; 

      } 


     } 
     //when i die and dump on first iteration then it's just fine 
    array:1 [▼ 
    "balance_sheet" => array:6 [▼ 
    0 => array:3 [▼ 
     "equity" => 1 
     "liabilities" => 1 
     "assets" => 1 
    ] 
    1 => array:3 [▼ 
     "equity" => 0 
     "liabilities" => 2 
     "assets" => 2 
    ] 
    2 => array:3 [▼ 
     "equity" => 0 
     "liabilities" => 3 
     "assets" => 3 
    ] 
    3 => array:3 [▼ 
     "equity" => 0 
     "liabilities" => 4 
     "assets" => 0 
    ] 
    4 => array:3 [▼ 
     "equity" => 0 
     "liabilities" => 5 
     "assets" => 0 
    ] 
    5 => array:3 [▼ 
     "equity" => 0 
     "liabilities" => 6 
     "assets" => 0 
    ] 
    ] 
] 
$columns = []; 

    } 

} 

我只是堅持在這裏並不能弄清楚如何使它的動態。

[$total_columns - 1] // the 1, 2, 3 or so on 
//something like [$total_columns - $i] 

因此,如果我讓foreach進行第二次迭代,那麼它會輸出undefined index error

e.x [$total_columns - 3]將導致-1 index第二次迭代,因爲第二次迭代只有2 total columns

這將導致Undefined offset: -1

我想實現

"balance_sheet" => array:6 [▼ 
0 => array:3 [▼ 
    "equity" => 1 
    "liabilities" => 1 
    "assets" => 1 
] 
1 => array:3 [▼ 
    "equity" => 0 
    "liabilities" => 2 
    "assets" => 2 
] 
2 => array:3 [▼ 
    "equity" => 0 
    "liabilities" => 3 
    "assets" => 3 
] 
3 => array:3 [▼ 
    "equity" => 0 
    "liabilities" => 4 
    "assets" => 0 
] 
4 => array:3 [▼ 
    "equity" => 0 
    "liabilities" => 5 
    "assets" => 0 
] 
5 => array:3 [▼ 
    "equity" => 0 
    "liabilities" => 6 
    "assets" => 0 
] 
], 
"income" => array:4 [▼ 
    0 => array:2 [▼ 
     "expenses" => 1 
     "income" => 1 
    ] 
    1 => array:2 [▼ 
     "expenses" => 2 
     "income" => 2 
    ] 
    2 => array:2 [▼ 
     "expenses" => 3 
     "income" => 3 
    ] 
    3 => array:2 [▼ 
     "expenses" => 0 
     "income" => 4 
    ] 
    ] 
] 

任何幫助將非常感激什麼。 感謝

+0

你想在這個源才達到什麼? – splash58

+0

@ splash58我只是想讓這個動態,所以我不需要手動給出數字......'[$ total_columns - $ i]'這樣的事情 –

+0

你期望的輸出是什麼? – axiac

回答

1
function spec_merge($arr) { 
    // find max length of array items 
    $m = max(array_map(count, $arr)); 

    // fill array items to max length by 0 
    $a = array_map(function($i) use($m) { 
      return ($m - count($i)) ? 
        $i + array_fill(count($i), $m - count($i), 0) : 
        $i; }, 
     $arr); 

    // make array of sourse keys  
    $keys = array_keys($a); 

    // transpose array 
    array_unshift($a, null); 
    $a = call_user_func_array("array_map", $a); 

    // set correct keys 
    $a = array_map(function ($i) use($keys) { 
      return array_combine($keys, $i); }, 
     $a); 
    return $a; 
} 

$new = spec_merge([ 
    'assets' => [1, 2, 3], 
    'liabilities' => [1, 2, 3, 4, 5, 6], 
    'equity' => [1] 
    ]); 

print_r($new); 

結果

[[ 
    [assets] => 1 
    [liabilities] => 1 
    [equity] => 1 
    ][ 
    [assets] => 2 
    [liabilities] => 2 
    [equity] => 0 
    ][    
    [assets] => 3 
    [liabilities] => 3 
    [equity] => 0 
    ][ 
    [assets] => 0 
    [liabilities] => 4 
    [equity] => 0 
    ][ 
    [assets] => 0 
    [liabilities] => 5 
    [equity] => 0 
    ][ 
    [assets] => 0 
    [liabilities] => 6 
    [equity] => 0 
    ]] 

demo

+0

這不是我想要的,請檢查輸出。 「收入」和「平衡表」都應該在那裏。 –

+0

'equity ='[1,2,3,4,5,6],' ''equity' => [1] ]),income => spec_merge([...]]];' – splash58

+0

不受支持的操作數類型'$ i + array_fill(count($ i),$ m - count($ i) ' –