Извлечь общую сумму многомерного массива, включая вложенные подмассивы - PullRequest
1 голос
/ 13 июня 2019

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

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

Имена ключей намеренно оставляются в виде чисел, поскольку мой больший скрипт будет постоянно увеличивать массив.Из-за этого роста подмассива, подмассивы могут быть 1, но также и 100.

Вопрос:

Как извлечь значение общего многомерногомассив, включая его подмассивы.

[$ array_1] работает должным образом:

<?php

/**
 * [array_1]
 * Array
 */

    $array_1 = [1, 2, 4];
?>
<pre>

<?php
    print_r($array_1);



    echo("Sum complete array_1: " . array_sum($array_1));

[$ array_2] Невозможно получить общее значение.

/**
 * [array_2]
 * Multidimensional array.
 */

    $array_2 = [

            [
                1, 2, 7
            ],

            [
                4, 5, 6
            ]

    ];
?>

<pre>
<?php

    print_r($array_2);

    // [$array_2].
    echo("Sum complete array_2: " . array_sum($array_2)); // Returns zero.
    echo("\n\n");
    echo("Sum sub-array [0]:" . array_sum($array_2["0"])); // Returns 10.
    echo("\n\n");
    echo("\n\n");

Ожидаемый результат [$ array_2]:

25

Ответы [ 5 ]

3 голосов
/ 13 июня 2019

One-лайнер,

echo array_sum(array_merge(...$array_2));

Я выставляю внутренние массивы, выравнивая их до 1d, а затем добавляю их с помощью array_sum.

array_merge - Объединить один или несколько массивов

... называется оператором splat , который выставляет массив как отдельные аргументы для подсчета массива.

EDIT

Вот еще один,

echo array_sum(array_reduce($array_2, 'array_merge', []));

Выход: 25

1 голос
/ 13 июня 2019

array_reduce лучше всего подходит для подобных ситуаций. Вы собираете сумму каждого отдельного подмассива в переменную и возвращаете их.

<?php

 $array_2 = [

            [
                1, 2, 7
            ],

            [
                4, 5, 6
            ]

];



$sum = array_reduce($array_2,function($sum,$value){
        $sum += array_sum($value);
        return $sum;
});

echo $sum;

Также обратите внимание, что это будет занимать очень меньше места по сравнению со слиянием массивов, поскольку каждый ваш подмассив может иметь длину 100 или более и может быть как минимум 1000 таких подмассивов (поскольку вы сказали, что ваш массив может расти).

0 голосов
/ 13 июня 2019
array_sum(call_user_func_array('array_merge', $array_2))
0 голосов
/ 13 июня 2019

Вы можете сделать самый быстрый способ,

<?php

$tot = 0;
foreach($array_2 as $value){
    $tot +=array_sum($value);
}
echo $tot;

ВЫХОД:

25

DEMO

0 голосов
/ 13 июня 2019

Вы можете использовать array_map (перебирать каждый под-массив) с array_sum

$t = 0;
array_map(function($v) use (&$t){ $t += array_sum($v);}, $array_2);

Рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...