<?php
class UserManager {
private $users = [];
public function addUser($user_id, $age, $country, $subscribed) {
if (isset($this->users[$user_id])) {
return false;
}
$this->users[$user_id] = [
'age' => $age,
'country' => $country,
'subscribed' => $subscribed
];
return true;
}
public function getUser($user_id) {
return $this->users[$user_id] ?? null;
}
public function updateUser($user_id, $age = null, $country = null, $subscribed = null) {
if (!isset($this->users[$user_id])) {
return false;
}
if ($age !== null) {
$this->users[$user_id]['age'] = $age;
}
if ($country !== null) {
$this->users[$user_id]['country'] = $country;
}
if ($subscribed !== null) {
$this->users[$user_id]['subscribed'] = $subscribed;
}
return true;
}
public function filterUsers($min_age = null, $max_age = null, $country = null, $subscribed = null) {
$filtered_users = [];
foreach ($this->users as $user_id => $profile) {
if ($min_age !== null && $profile['age'] < $min_age) {
continue;
}
if ($max_age !== null && $profile['age'] > $max_age) {
continue;
}
if ($country !== null && $profile['country'] !== $country) {
continue;
}
if ($subscribed !== null && $profile['subscribed'] !== $subscribed) {
continue;
}
$filtered_users[] = $user_id;
}
return $filtered_users;
}
public function aggregateStats() {
$total_users = count($this->users);
if ($total_users === 0) {
return [
"total_users" => 0,
"average_age" => 0,
"subscribed_ratio" => 0.00
];
}
$total_age = array_reduce($this->users, function ($sum, $profile) {
return $sum + $profile['age'];
}, 0);
$subscribed_users = count(array_filter($this->users, function ($profile) {
return $profile['subscribed'];
}));
$average_age = floor($total_age / $total_users);
$subscribed_ratio = round($subscribed_users / $total_users, 2);
return [
"total_users" => $total_users,
"average_age" => $average_age,
"subscribed_ratio" => $subscribed_ratio
];
}
}
// Example usage
$um = new UserManager();
$um->addUser("u1", 25, "USA", true);
$um->addUser("u2", 30, "Canada", false);
$um->addUser("u3", 22, "USA", true);
$result1 = $um->filterUsers(20, 30, "USA", true);
echo implode(" ", $result1) . "\n"; // u1 u3
$result2 = $um->filterUsers(null, 28, null, null);
echo implode(" ", $result2) . "\n"; // u1 u3
$result3 = $um->filterUsers(null, null, "Canada", false);
echo implode(" ", $result3) . "\n"; // u2
$stats = $um->aggregateStats();
echo "Total users: " . $stats["total_users"] . "\n"; // 3
echo "Average age: " . $stats["average_age"] . "\n"; // 25
echo "Subscribed ratio: " . $stats["subscribed_ratio"] . "\n"; // 0.67
?>