2015-10-23 4 views
-3

дал этот массив:значения суммы с заданным ключом в php?

array(40) { 
    [0]=> 
    array(10) { 
    ["item"]=> 
    string(5) "AABBCC" 
    ["quants"]=> 
    string(1) "1" 
    } 
    [1]=> 
    array(10) { 
    ["item"]=> 
    string(5) "AABBCC" 
    ["quants"]=> 
    string(1) "1" 
    } 
    [2]=> 
    array(10) { 
    ["item"]=> 
    string(5) "SLF02" 
    ["quants"]=> 
    string(1) "1" 

    } 
    [3]=> 
    array(10) { 
    ["item"]=> 
    string(5) "SLF02" 
    ["quants"]=> 
    string(1) "3" 
    } 
} 

как без использования Еогеасп я в конечном итоге с этого выхода:

array(40) { 
    [0]=> 
    array(10) { 
     ["item"]=> 
     string(5) "AABBCC" 
     ["quants"]=> 
     string(1) "2" 
    } 
    [1]=> 
    array(10) { 
     ["item"]=> 
     string(5) "SLF02" 
     ["quants"]=> 
     string(1) "3" 
    } 
    } 

есть какие-либо array_sum функции, чтобы сделать это с помощью многомерного массива, как это в PHP?

+1

array_map, наверное, но по-прежнему использует цикл внутри , почему страх перед визитом? –

+0

, потому что это работает в вложенном foreach allready, и я мог обойтись без использования другого. но если foreach - это способ сделать это .. тогда hey ho .. – vimes1984

+0

Просто потому, что вы используете 'array_map()', который использует цикл внутри, не делает его лучше – Rizier123

ответ

2

Это плохая идея, но, казалось, как забавная задача сделать без Еогеаспа:

$arr = 
[ 
    [ 
    "item" =>"AABBCC", 
    "quants" => "1", 
    ], 
    [ 
    "item" => "AABBCC", 
    "quants" => "1", 
    ], 
    [ 
    "item" => "SLF02", 
    "quants" => "1", 
    ], 
    [ 
    "item" => "SLF02", 
    "quants" => "3", 
    ] 
]; 

$arr = array_values(call_user_func_array("array_merge", array_map(function($i) use ($arr) { 
    return [$i["item"] => ["item" => $i["item"], "quants" => array_reduce(
    array_filter($arr, function($j) use ($i) { 
     return $j["item"] == $i["item"]; 
    }), function($carry, $item) { 
     return $carry + $item["quants"]; 
    }) 
    ]]; 
}, $arr))); 

var_dump($arr); 

/* 
array(2) { 
    [0]=> 
    array(2) { 
    ["item"]=> 
    string(6) "AABBCC" 
    ["quants"]=> 
    int(2) 
    } 
    [1]=> 
    array(2) { 
    ["item"]=> 
    string(5) "SLF02" 
    ["quants"]=> 
    int(4) 
    } 
} 
*/ 
1

Вот мой подход:

<?php 
$array = array(
    array('item'=>'AABBCC','quants'=>1), 
    array('item'=>'AABBCC','quants'=>1), 
    array('item'=>'SLF02','quants'=>1), 
    array('item'=>'SLF02','quants'=>3), 
); 

$summed_array = array(); 

foreach($array as $row){ 
    $key = $row['item']; 

    if(!isset($summed_array[$key])){ 
     $summed_array[$key] = array(
      'item' => $row['item'], 
      'quants' => 0 
     ); 
    } 

    $summed_array[$key]['quants'] += $row['quants']; 
} 

// turn the array back to a 0 based array 
$summed_array = array_values($summed_array); 

echo '<pre>',print_r($summed_array),'</pre>'; 
Смежные вопросы