2016-04-28 2 views
0

Этот вопрос может быть задан много раз, но моя небольшая разница в том смысле, что у меня нет другого массива для объединения.merge multi dimentional php array with in

Я хочу объединить массивы с многомерным массивом.

Чтобы его не было многомерным.

Вот массив, который у меня есть.

Array 
(
    [2013-12-01::2015-07-29] => Array 
     (
      [TotalMonths] => 1 
      [0] => 2015-07-01 
     ) 

    [2015-11-01::2016-03-30] => Array 
     (
      [TotalMonths] => 5 
      [0] => 2015-11-01 
      [1] => 2015-12-01 
      [2] => 2016-01-01 
      [3] => 2016-02-01 
      [4] => 2016-03-01 
     ) 

    [2016-04-01::2017-11-30] => Array 
     (
      [TotalMonths] => 3 
      [0] => 2016-04-01 
      [1] => 2016-05-01 
      [2] => 2016-06-01 
     ) 

) 

, что я пытаюсь вливается все массивы. Но индекс (TotalMonths) является общим, так только, что он должен суммировать значения, как (1+5+3) = 8 , которые будут отражены в новом объединенном массиве.

Я попробовал этот пример .. PHP: Turning multidimensional arrays to single dimension arrays

, но не знаю, как я получаю те же значения ..

Это то, что я пытался до сих пор ..

print_r($collidingMonths); 
$outPutArray = array(); 
foreach($collidingMonths as $innerArray) { 
    $outPutArray[key($innerArray)] = current($innerArray); 
} 

print_r($outPutArray); 

Но, к сожалению, я получаю результат, который я не хочу :(

Array 
(
    [TotalMonths] => 3 
) 
+0

'$ outPutArray [ключ ($ innerArray)] = ток ($ innerArray); 'почему вы используете' current'? –

+0

Какой ваш желаемый результат выглядит как ??? Я имею в виду выходной массив. –

ответ

1

Самый прямой способ будет принимать значение TotalMonths из элементов массива перед объединением:

$result = []; 
$totalMonths = 0; 
foreach($collidingMonths as $innerArray) { 
    $TotalMonths += $innerArray['TotalMonths']; 
    unset($innerArray['TotalMonths']); 
    $result = array_merge($result, $innerArray); 
} 

== - == - == - = -

UPDATE:

Спасибо, очень хорошая работа здесь. Мне пришлось немного попрактиковаться. но все это ваш код. Предоставление моего обновленного кода может быть полезно для некоторых.

Обновленный код

 $outPutMonths = []; 
     $TotalMonths = 0; 
     foreach($collidingMonths as $innerArray) { 
      $TotalMonths += $innerArray['TotalMonths']; 
      unset($innerArray['TotalMonths']); 
      $outPutMonths = array_merge($outPutMonths, $innerArray); 
     } 
     $outPutMonths['TotalMonths'] = $TotalMonths; 

Обновленный результат (желаемый результат):

Array 
(
[TotalMonths] => 9 
[0] => 2015-07-01 
[1] => 2015-11-01 
[2] => 2015-12-01 
[3] => 2016-01-01 
[4] => 2016-02-01 
[5] => 2016-03-01 
[6] => 2016-04-01 
[7] => 2016-05-01 
[8] => 2016-06-01 
) 
0

Просто используйте array_sum и array_column. Пусть $collidingMonths в качестве основного массива.

$arr2 = array_column($collidingMonths, 'TotalMonths'); 
echo array_sum($arr2); 

Результат

Выходной массив:

Array 
(
    [0] => 1 
    [1] => 5 
    [2] => 3 
) 

Сумма:

1

Я думаю, что ожидаемый выход OP хочет:

array 
(
    [TotalMonths] => 9, 
    [0] => 2015-07-01, 
    [1] => 2015-11-01, 
    [2] => 2015-12-01, 
    [3] => 2016-01-01, 
    [4] => 2016-02-01, 
    [5] => 2016-03-01, 
    [6] => 2016-04-01, 
    [7] => 2016-05-01, 
    [8] => 2016-06-01, 
) 

Чтобы получить, что мы можем сделать что-то вроде этого:

$outPutArray = array(); 

foreach($collidingMonths as $timestamp => $monthsArray) 
{ 
    foreach($monthsArray as $key => $value) 
    { 
     if(is_numeric($value)) 
     { 
      if(isset($outPutArray[$key])) 
       $outPutArray[$key] += $value; 
      else 
       $outPutArray[$key] = $value; 
     } 
     else 
     { 
      array_push($outPutArray, $value); 
     } 
} 
+0

Thankyou очень много. Ваш ответ тоже замечательный. Я поддержал это. Но я выбрал @Sergey ответ, поскольку он был первым, чтобы ответить, и у него есть только 1 цикл foreach, поэтому я думаю, что он более эффективен. Но ваш код отлично работает, и я тестировал его. Благодарю. –