开发者

Merge arrays together based on different values

开发者 https://www.devze.com 2023-03-07 23:53 出处:网络
I am having trouble thinking of the logic with the following problem: I have the following array (has been snipped, as its much larger)

I am having trouble thinking of the logic with the following problem:

I have the following array (has been snipped, as its much larger)

Array
(
    [0] => Array
        (
            [code] => LAD001
            [whqc] => GEN
            [stocktag] => NONE
            [qty] => 54
        )

    [1] => Array
        (
            [code] => LAD001
            [whqc] => GEN
            [stocktag] => NONE
            [qty] => 6
        )

    [2] => Array
        (
            [code] => LAD004
            [whqc] => HOLD
            [stocktag] => NONE
            [qty] => 6
        )

)

I basically need to comebine all the keys in this array so that where the code, whqc and stocktag are the same, add the qty values together. With the example below, I need to end up with this:

Array
(
    [0] => Array
        (
            [code] => LAD001
            [whqc] => GEN
            [stocktag] => NONE
            [qty] => 60
        )

    [1] => Array
        (
            [code] => LAD004
            [whqc] => HOLD
            [stocktag] => NONE
            [qty] => 6
        )

)

As the first and second keys of the array had the same code, whqc and stocktag, the qty's have been added together into the one key.

Any id开发者_JAVA百科eas?


I would suggest combining the group values in to a hash, storing the full array under the hash as a key and if you have a duplicate, add the quantity, then do array_values() to pull the results.

$aggregated = array();
foreach ($records as $cRec) {
    // The separator | has been used, if that appears in the tags, change it
    $cKey = md5($cRec['code'] . '|' . $cRec['whqc'] . '|' . $cRec['stocktag']);

    if (array_key_exists($cKey, $aggregated)) {
        $aggregated[$cKey]['qty'] += $cRec['qty'];
    } else {
        $aggregated[$cKey] = $cRec;
    }
}

// Reset the keys to numerics
$aggregated = array_values($aggregated);


I would try something like:

   $output = array();
    foreach($array as $details){
        //make distinct key
        $key = $details['code'].'_'.$details['whqc'];
        if(!isset($output[$key])){
            $output[$key] = $details;
        }else{
            $output[$key]['qty'] += $details['qty']; 
            $output[$key]['stocktag'] = $details['stocktag'];
        }
    }
    $output = array_values($output);
    print_r($output);

update: Orbling was first ;-)

0

精彩评论

暂无评论...
验证码 换一张
取 消