2015-12-01 3 views
0

У меня есть следующий массив:Добавление значений в многомерном массиве

array:3 [▼ 
    0 => array:2 [▼ 
    "modId" => "3" 
    "prdWt" => 1500.0 
    ] 
    1 => array:2 [▼ 
    "modId" => "8" 
    "prdWt" => 50.0 
    ] 
    2 => array:2 [▼ 
    "modId" => "8" 
    "prdWt" => 10.0 
    ] 
] 

То, что я пытаюсь достичь этого, массив ребенок должен сложить значения из prdWt если modId такое же.

Что я хочу:

array:2 [▼ 
    0 => array:2 [▼ 
    "modId" => "3" 
    "prdWt" => 1500.0 
    ] 
    1 => array:2 [▼ 
    "modId" => "8" 
    "prdWt" => 60.0 
    ] 
] 

код до сих пор, что я пробовал:

//$prdModWt is the parent array coming from session 
foreach ($prdModWt as $prd) { 
    $val = $this->checkKey($prdModWt, 'modId', $prd['modId']); 

    var_dump($val); 

    $a[] = $this->sum_index($prdModWt, 'prdWt'); 
} 

public function sum_index($arr, $col_name) 
{ 
    $sum = 0; 
    foreach ($arr as $item) { 
     $sum += $item[$col_name]; 
    } 
    return $sum; 
} 

public function checkKey($array, $key, $val) 
{ 
    foreach ($array as $item) { 
     if (isset($item[$key]) && $item[$key] == $val) { 
      return true; 
     } 
    } 
    return false; 
} 

Я знаю, что это слишком просто, чтобы достичь, но я уверен, не в этом. Так любезно помогите мне.

P.S. Родительский массив является динамическим .. Значение значений происходит только из сеанса, но значения сохраняются в сеансе после извлечения из базы данных.

ответ

1

Вы можете просто добиться того, что в пределах одного цикла только вроде как

$arr = [["modId" => "3", 
    "prdWt" => 1500.0 
    ],["modId" => "8", 
    "prdWt" => 50.0 
    ],["modId" => "8", 
    "prdWt" => 10.0 
    ] 
]; 

$result = []; 
foreach($arr as $key => $value){ 
    $hash = $value['modId']; 
    if(isset($result[$hash])){ 
     $result[$hash]['prdWt'] += $value['prdWt']; 
    }else{ 
     $result[$hash]['modId'] = $value['modId']; 
     $result[$hash]['prdWt'] = $value['prdWt']; 
    } 
} 
print_r(array_values($result)); 

Demo

+0

Спасибо .. Ваше решение работало как шарм .. :) –

+0

Добро пожаловать. Рад, что это помогло вам ... –

0

Ну, простой способ сделать это (но некрасиво, я постараюсь придумать что-то проще) заключается в следующем:

$results = []; 
foreach($array as $i => $item) { 
    if($item['modId'] == $array[$i + 1]['modId']) { 
     $results[] = ['modId' => $item['modId'], 'prdWt' => $item['prdWt'] + $array[$i + 1]['prdWt']]; 
    } 
} 

Вы также можете легко написать рекурсивную решение, которое я считаю,

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