如何从这个数组中分别找到年龄在 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
)
$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
)