Рассчитать некоторые итоги на основе существующих массивов - PullRequest
2 голосов
/ 13 мая 2019

Я хочу вычислить некоторые итоги на основе существующих многомерных массивов

Мой массив:

Array
(
    [0] => Array
        (
            [ORIGINE] => AL
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => QUINZE
        )
    [1] => Array
        (
            [ORIGINE] => SU
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => QUINZE
        )
    [2] => Array
        (
            [ORIGINE] => RE
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => MEMBRES
        )

    [3] => Array
        (
            [ORIGINE] => SL
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => MEMBRES
        )

    [4] => Array
        (
            [ORIGINE] => BE
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => EST
        )

    [5] => Array
        (
            [ORIGINE] => RP
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => EST
        )

    [6] => Array
        (
            [ORIGINE] => DF
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => TIERS
        )

    [7] => Array
        (
            [ORIGINE] => AR
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => TIERS
        )
)


I tried something like this :
public function calculateTotals($datas)
{
    $totals = [];
    foreach ($datas as $data) {
        $nextElement = next($data);
        foreach ($data as $key => $value) {
            if($data['GEOGRAPHIE'] == $nextElement['GEOGRAPHIE']) {
                if(!in_array($key, ['ORIGINE', 'GEOGRAPHIE'])) {
                    $totals[$key] += $value;
                }
            } else {

            }
        }
    }

    return $datas;
}

Идея состоит в том, чтобы создать новый массив на основе предыдущего массива + вычислить итоги для каждого GEOGRAFIE и вставить его в массив. Поэтому вычислите сумму всех столбцов, ожидайте «ORIGINE» и «GEOGRAPHIE» и поместите все значения сразу после того, как массив начнет с нового «GEOGRPAPHIE». Примерно так:

Array
(
    [0] => Array
        (
            [ORIGINE] => AL
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => QUINZE
        )
    [1] => Array
        (
            [ORIGINE] => SU
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => QUINZE
        )
    [2] => Array
        (
            [ORIGINE] => QUINZE
            [t] => 2
            [p] => 4
            [e] => 6
            [f] => 8
            [GEOGRAPHIE] => QUINZE
        )
    [3] => Array
        (
            [ORIGINE] => RE
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => MEMBRES
        )

    [4] => Array
        (
            [ORIGINE] => SL
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => MEMBRES
        )

    [5] => Array
        (
            [ORIGINE] => MEMBRES
            [t] => 2
            [p] => 4
            [e] => 6
            [f] => 8
            [GEOGRAPHIE] => MEMBRES
        )

    [5] => Array
        (
            [ORIGINE] => BE
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => EST
        )

    [6] => Array
        (
            [ORIGINE] => RP
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => EST
        )
    [7] => Array
        (
            [ORIGINE] => EST
            [t] => 2
            [p] => 4
            [e] => 6
            [f] => 8
            [GEOGRAPHIE] => EST
        )

    [8] => Array
        (
            [ORIGINE] => DF
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => TIERS
        )

    [9] => Array
        (
            [ORIGINE] => AR
            [t] => 1
            [p] => 2
            [e] => 3
            [f] => 4
            [GEOGRAPHIE] => TIERS
        )
    [10] => Array
        (
            [ORIGINE] => TIERS
            [t] => 2
            [p] => 4
            [e] => 6
            [f] => 8
            [GEOGRAPHIE] => TIERS
        )
)

1 Ответ

1 голос
/ 13 мая 2019

Пожалуйста, найдите мою внутреннюю документацию для объяснения,

function calculateTotals($datas)
{
    $totals = [];
    $result = [];
    foreach ($datas as $key1 => $data) {
        $nextElement       = (!empty($datas[$key1 + 1]) ? $datas[$key1 + 1] : []); // checking for next element exists
        $result[]          = $data;
        $totals['ORIGINE'] = $data['GEOGRAPHIE']; // setting total array's ORIGINE and GEOGRAPHIE to merge
        foreach ($data as $key => $value) {
            if (!in_array($key, ['ORIGINE', 'GEOGRAPHIE'])) { // fetching only required keys
                $totals[$key] = (!empty($totals[$key]) ? $totals[$key] : 0);
                $totals[$key] += $value; // adding every other keys
            }
        }
        $totals['GEOGRAPHIE'] = $data['GEOGRAPHIE']; // setting total array's ORIGINE and GEOGRAPHIE to merge
        if (empty($nextElement) || $data['GEOGRAPHIE'] != $nextElement['GEOGRAPHIE']) { // checking if next is different then push
            array_push($result, $totals);
            $totals = []; // resetting total array
        }
    }
    return $result;
}

Рабочая демо .

...