среднее и сумма из массива в переполнении стека

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

Я хочу найти следующее из массива дать, пожалуйста, помогите мне

1) Средний возраст всех пользователей мужского и женского пола

2) Средний возраст мужчин и женщин-пользователей в каждой стране

3) Поскольку мы не ориентируемся на детей, не следует включать пользователей младше 16 лет

4) Средний балл активности по полу

5) Сумма балльной активности по возрастной группе 16-20, 20+

6) Страны с самым высоким и самым низким показателем активности

Входные и выходные массивы приведены ниже. Пожалуйста, обновите выходной массив с правильными значениями

$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],
];

$output = [
'avg_age' => ['M' => 0,'F' => 0],
'avg_age_by_country' => [
'IN' => ['M' => 0,'F' => 0],
'US' => ['M' => 0,'F' => 0],
'UK' => ['M' => 0,'F' => 0],
'JP' => ['M' => 0,'F' => 0],
],
'activity_score' => [
'avg_score_by_gender' => ['M' => 0,'F' => 0],
'sum_score_by_age_group' => ['16-20' => 0, '20+' => 0],
'country' => ['first' => '', 'last' => '']
]
];

Я пробовал это

foreach($users as $user) {
if($user['gender'=='M']) {
$avg['M']=$user;
}
else if($user['gender'=='F']) {
$avg['M']=$user;
}
}

print_r($avg);

Я пытался это, пожалуйста, помогите мне решить эту проблему

-3

Решение

чтобы вычислить среднее значение, вы должны обновить выходной массив, включив в него некоторые важные данные, такие как количество пользователей M, F
общий возраст М, ж
общий балл M, F
и количество пользователей и общий возраст для каждой страны
а затем вы можете рассчитать среднее значение, разделив сумму на число
средний возраст мужчин = общий возраст мужчин / число мужчин

это рабочий код для этой проблемы

<?
$output = array(
'number_of_users' => array('M' => 0,'F' => 0),//New array to hold number of users
'total_users_age' => array('M' => 0,'F' => 0),//New array to hold Total Ages
'total_users_score' => array('M' => 0,'F' => 0),//new array to hold total users score
'avg_age' => array('M' => 0,'F' => 0),
//update each country array to add
//NM - number of males
//NF - number of females
//AM - Total males age
//AF - Total females age
'avg_age_by_country' => array(
'IN' => array('M' => 0,'F' => 0,'NM' => 0,'NF' => 0,'AM' => 0,'AF' => 0),
'US' => array('M' => 0,'F' => 0,'NM' => 0,'NF' => 0,'AM' => 0,'AF' => 0),
'UK' => array('M' => 0,'F' => 0,'NM' => 0,'NF' => 0,'AM' => 0,'AF' => 0),
'JP' => array('M' => 0,'F' => 0,'NM' => 0,'NF' => 0,'AM' => 0,'AF' => 0),
),
'activity_score' => array(
'avg_score_by_gender' => array('M' => 0,'F' => 0),
'sum_score_by_age_group' => array('16-20' => 0, '20+' => 0),
'country' => array('first' => '', 'last' => '')
)
);


$max = 0;//variable to detect the highest county score
$min = "notSet";//variable to detect the lowest county score
foreach($users as $user){
$output['number_of_users'][$user['gender']]++;//increase number of users based on user gender
$output['total_users_age'][$user['gender']] = ($output['total_users_age'][$user['gender']] + (date(Y) - $user['dob']));//add user age to total ages based on his gender
$output['total_users_score'][$user['gender']] = ($output['total_users_score'][$user['gender']] + (date(Y) - $user['activity_score']));//add user score to total score based on his gender
$output['avg_age_by_country'][$user['country']]['N'.$user['gender']]++;//increase number of users based on user gender and country
$output['avg_age_by_country'][$user['country']]['A'.$user['gender']] = ($output['avg_age_by_country'][$user['country']]['A'.$user['gender']] + (date(Y) - $user['dob']));//add user age to total ages based on his gender and country
//detect user age group and add up user score
if((date(Y) - $user['dob']) >= 16 && (date(Y) - $user['dob']) <= 20){
$output['activity_score']['sum_score_by_age_group']['16-20'] = ($output['activity_score']['sum_score_by_age_group']['16-20'] + $user['activity_score']);
}elseif((date(Y) - $user['dob']) > 20){
$output['activity_score']['sum_score_by_age_group']['20+'] = ($output['activity_score']['sum_score_by_age_group']['16-20'] + $user['activity_score']);
}
//detect max country
if($user['activity_score'] > $max){
$output['activity_score']['country']['first'] = $user['country'];
$max = $user['activity_score'];
}
//detect min country
//notSet mean this is the first user
if($user['activity_score'] < $min || $min == "notSet"){
$output['activity_score']['country']['last'] = $user['country'];
$min = $user['activity_score'];
}
}
/******* calculating averages******/
$output['avg_age']['M'] = $output['total_users_age']['M'] / $output['number_of_users']['M'];
$output['avg_age']['F'] = $output['total_users_age']['F'] / $output['number_of_users']['F'];
$output['activity_score']['avg_score_by_gender']['M'] = $output['total_users_score']['M'] / $output['number_of_users']['M'];
$output['activity_score']['avg_score_by_gender']['F'] = $output['total_users_score']['F'] / $output['number_of_users']['F'];
/******* calculating averages for each country******/
foreach($output['avg_age_by_country'] as $key => $country ){
$output['avg_age_by_country'][$key]['M'] = $country['AM'] / $country['NM'];
$output['avg_age_by_country'][$key]['F'] = $country['AF'] / $country['NF'];
}

echo '<pre>';
print_r($output);
echo '</pre>';
?>

надеюсь, это хорошо работает
и удачи

1

Другие решения

Например, вы можете вручную отсортировать пользователей по мужчинам и женщинам с помощью ручной итерации, а затем применить свой массив_сум / число к столбцу «dob» …

// Sort $users into $male or $female
$male = array();
$female = array();
foreach( $users as $user )
{
if( $user['gender'] == 'M' )
{
$male[] = $user;
}
elseif( $user['gender'] == 'F' )
{
$female[] = $user;
}
}

// Average DOB value
vardump( array_sum( array_column( $male, 'dob' ) ) / count( $male ) );
vardump( array_sum( array_column( $female, 'dob' ) ) / count( $female ) );

Вы должны построить свою логику сортировки / фильтрации, это простой пример.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector