1

ソースとターゲットが同じであるすべてのエントリの total_volume を合計したい次の配列があります。

Array (
[0] => Array
    (
        [source] => ABC
        [target] => DEF
        [total_volume] => 10
    )

[1] => Array
    (
        [source] => ABC
        [target] => GHI
        [total_volume] => 5
    )
[2] => Array
    (
        [source] => ABC
        [target] => DEF
        [total_volume] => 5
    )
)

結果の配列は次のようになります。

ResultArray (
[0] => Array
    (
        [source] => ABC
        [target] => DEF
        [total_volume] => 15
    )

[1] => Array
    (
        [source] => ABC
        [target] => GHI
        [total_volume] => 5
    )
)

私の最初の考えは、既存の配列を llop し、一致するソースとターゲットのペアを持つエントリが既に存在するかどうか、ResultArray のネストされたループを介してチェックすることです。

array_walk() または同様の方法を使用する他の方法はありますか?

よろしくお願いします。

4

4 に答える 4

2

きれいではありませんが、ネストされた foreach でそれを行う方法を次に示します。

$aStartingArray = array();
$aStartingArray[] = array('source'=>'ABC', 'target' => 'DEF', 'total_volume' => 10); 
$aStartingArray[] = array('source'=>'ABC', 'target' => 'GHI', 'total_volume' => 5); 
$aStartingArray[] = array('source'=>'ABC', 'target' => 'DEF', 'total_volume' => 5); 


$aSortedArray = array();

foreach ($aStartingArray as $aArray) {

    $bSet = false;

    foreach ($aSortedArray as $iPos => $aTempSortedArray) {

        if(
            $aTempSortedArray['source'] == $aArray['source'] && 
            $aTempSortedArray['target'] == $aArray['target']){

            $aSortedArray[$iPos]['total_volume'] += $aArray['total_volume'];

            $bSet = true;
        }

    }

    if(!$bSet) {

        $aSortedArray[] = array(
            'source' => $aArray['source'], 
            'target' => $aArray['target'], 
            'total_volume' => $aArray['total_volume']
            );
    }
}


var_dump($aSortedArray);
于 2016-06-07T10:15:16.300 に答える
1

これは簡単な試行です (申し訳ありませんが、array_walk を 2 回使用します)。

<?php

$a = [
    ['source' => 'ABC', 'target' => 'DEF', 'total_volume' => 10 ],
    ['source' => 'ABC', 'target' => 'GHI', 'total_volume' => 5 ],
    ['source' => 'ABC', 'target' => 'DEF', 'total_volume' => 5 ],
];

$tmp = [];

array_walk($a, function (&$item, $key) use (&$tmp) {
    $resKey = $item['source'].'_'.$item['target'];
    if (!isset($result[$resKey])) {
        $result[$resKey] = 0;
    }
    $tmp[$resKey] += $item['total_volume'];
});

$result = [];
array_walk($tmp, function (&$item, $key) use (&$result) {
    list ($source, $target) = explode('_', $key);
    $result[] = ['source' => $source, 'target' => $target, 'total_volume' => $item];
});

var_dump($result);
于 2016-06-07T10:09:39.510 に答える