如何从这个数组中分别找到年龄在 16-20 岁和 20 岁以上的用户的 activity 分数之和

how find sum of activity score of users i age 16-20 and 20+ separately from this array

    $users = [
    ['id' => 1, 'gender' => 'M', 'dob' => 1990, 'country' => 'IN', 'activity_score' => 34],
    ['id' => 2, 'gender' => 'M', 'dob' => 1980, 'country' => 'US', 'activity_score' => 9],
    ['id' => 3, 'gender' => 'F', 'dob' => 1993, 'country' => 'UK', 'activity_score' => 45],
    ['id' => 4, 'gender' => 'M', 'dob' => 1998, 'country' => 'IN', 'activity_score' => 0],
    ['id' => 5, 'gender' => 'F', 'dob' => 1997, 'country' => 'IN', 'activity_score' => 234],
    ['id' => 6, 'gender' => 'M', 'dob' => 1991, 'country' => 'UK', 'activity_score' => -6],
    ['id' => 7, 'gender' => 'F', 'dob' => 1992, 'country' => 'JP', 'activity_score' => 9],
    ['id' => 8, 'gender' => 'M', 'dob' => 1998, 'country' => 'US', 'activity_score' => 45],
    ['id' => 9, 'gender' => 'F', 'dob' => 2000, 'country' => 'JP', 'activity_score' => 5],
    ['id' => 10, 'gender' => 'M', 'dob' => 2006, 'country' => 'IN', 'activity_score' => 7],
    ['id' => 11, 'gender' => 'F', 'dob' => 1970, 'country' => 'US', 'activity_score' => 32],
    ['id' => 12, 'gender' => 'M', 'dob' => 2011, 'country' => 'IN', 'activity_score' => 21],
    ];
    $act_sum=0;
$act_sum1=0;
    foreach($users as $user){

   $age=date('Y')-$user['dob'];
   if($age>=16&& $age<=20)
   {
       $act_sum+=$user['activity_score'];

   }
    else if($age>20){
        $act_sum1+=$user['activity_score'];
    }
    }

如果没有这些 if 条件,数组函数本身是否可行? 我必须按年龄组 16-20、20+

找到 Sum activity 分数

试试这个:

$min = 16;
$max = 20;
$newNumbers = array_filter(
    $users,
    function ($value) use($min, $max) {
        return (date('Y') - $value['dob']) >= $min && (date('Y') - $value['dob']) <= $max;
    }
);

$sum = 0;
foreach ($newNumbers as $value) {
    $sum += $value['activity_score'];
}

您正在将数组与整数进行比较,因此新数组为空。

我通过这种方式确定年龄(基于当前年份减去出生年份 - 这不准确;考虑使用像 Carbon 这样的库并使用完整日期),由此我能够确定用户是否在最小值和最大值之间老化。

foreach 然后只是循环遍历新的用户集并添加他们的 activity 分数并将其存储在名为 sum.

的变量中

根据您的编辑进行编辑

$min = 16;
$max = 20;
$sumInRange = $sumOutOfRange = 0;

$inRange = array_filter(
    $users,
    function ($value) use($min, $max) {
        return (date('Y') - $value['dob']) >= $min && (date('Y') - $value['dob']) <= $max;
    }
);

// 
function udiffCompare($a, $b)
{
    return $a['id'] - $b['id'];
}

$outOfRange = array_udiff($users, $inRange, 'udiffCompare');

foreach ($inRange as $value) {
    $sumInRange += $value['activity_score'];
}

foreach ($outOfRange as $value) {
    $sumOutOfRange += $value['activity_score'];
}

var_dump(
    $sumInRange,
    $sumOutOfRange
);

上面的代码与这个答案顶部使用的代码非常相似,只是这次我存储了用户数组的两个版本——一个在范围内,一个在范围外。

那么这只是迭代这些新数组并计算总和的情况。

也许试试这个:

// Your result array with score by age group
$result = array(
    '16-20' => 0,
    '20+' => 0
);
// The current year
$current_year = date('Y');

// Loop throught users
foreach ($users as $user) {
    // I calcul the age of the user according to current_year
    $age = $current_year - $user['dob'];

    // If $user age is 16, 17, 18 or 19, I add his score
    if ($age < 20 && $age >= 16) {
        $result['16-20'] = $result['16-20'] + $user['activity_score'];
    }

    // If user is 20 or more
    if ($age >= 20) {
        $result['20+'] = $result['20+'] + $user['activity_score'];
    }
}

有:

var_dump($result);

我明白了:

array (size=2)
    '16-20' => int 5
    '20+' => int 402

不使用 FOREACH 进行编辑:

// I create a function that return an array with the score of user by age
function get_score($user) {
    $result = array();
    $current_year = date('Y');

    $age = $current_year - $user['dob'];

    if ($age < 20 && $age >= 16) {
        $result['16-20'] = $user['activity_score'];
    }
    if ($age >= 20) {
        $result['20+'] = $user['activity_score'];
    }
    return $result;
}

// Then I create my $result array :
$result = array(
    '16-20' => array_sum(array_column(array_map( "get_score", $users), '16-20')),
    '20+' => array_sum(array_column(array_map( "get_score", $users), '20+'))
);

老实说,我并没有使用很多数组函数,所以我相信我们可以用更好的方法来做到这一点,但是这个在这里很有效:)

我得到了与 var_dump($result');

相同的结果

您可以将函数式方法与本机 array_reduce 函数结合使用,而不涉及循环。

$sumByAgeGroup = array_reduce($users, function($carry, $item) {
    $age = date('Y') - $item['dob'];
    if ($age > 20) {
        $carry['>20'] += $item['activity_score'];
    } elseif ($age >= 16 && $age <= 20) {
        $carry['16-20'] += $item['activity_score'];
    }
    return $carry;
}, ['16-20' => 0, '>20' => 0]);

var_dump($sumByAgeGroup);

输出:

Array
(
    [16-20] => 5
    [20+] => 402
)