Сумма столбцов в многомерном массиве без циклов

0

Я привык к анализу данных в R и сложно определить массив в PHP.

Учитывая следующий массив ($dat), какой самый простой способ получить общее число всех женщин?

print("<pre>".print_r($dat,true)."</pre>");

Array
(
    [0] => Array
        (
            [0] => female
            [1] => blue
            [2] => 62
        )

    [1] => Array
        (
            [0] => female
            [1] => red
            [2] => 22
        )

    [2] => Array
        (
            [0] => male
            [1] => blue
            [2] => 21
        )

)

Я делаю это:

foreach($dat as $row) {
    if($row[0]=='female') {
        $females = $females + $row[2];
    }
}

Но должен быть путь без петель!

Разве нет что-то вроде sum($dat[][2])?


Результат для этого образца должен составлять 84

Теги:
arrays
multidimensional-array

2 ответа

0
Лучший ответ

Вы можете array_reduce ваш массив на сумму таким образом:

$array[0] = array('female', 2);
$array[1] = array('female', 5);
$array[2] = array('male', 2);

$sum = array_reduce($array, function ($value, $item) {
    if ($item[0] == 'female') $value += $item[1];
    return $value;
}, 0);

var_dump($sum);

Вывод:

7
1

Кажется, я неверно истолковал ваш вопрос...

Чтобы получить сумму, вы можете использовать array_reduce вместо цикла foreach (хотя это не будет большим улучшением):

array_reduce($dat, function($prev,$curr){return $prev+($curr[0]==='female'?$curr[2]:0);}, 0);

Чтобы получить количество элементов, содержащих "женский", вы можете использовать count с array_filter:

echo count(array_filter($dat, function($x){return in_array('female', $x);}));

Это фильтрует массив для любых подматриц, которые содержат строку female и возвращает количество элементов.

Если вы уверены, что строка 'female' всегда является нулевым элементом массива, вы можете немного упростить функцию:

echo count(array_filter($dat, function($x){return $x[0]==='female';}));
  • 0
    Ну, этот парень заслуживает печенье. +1
  • 0
    Да, но вы все еще можете делать что-то еще внутри функции, мне лично понравилась идея использовать array_filter вместо foreach. @ ClémentMalet

Ещё вопросы

Сообщество Overcoder
Наверх
Меню