php group by
* groupby.php
<?php
function groupby(array $a, string $prop) {
return array_reduce($a, function($acc, $obj) use ($prop) {
$key = $obj[$prop];
if (!array_key_exists($key, $acc)) {
$acc[$key] = [];
}
array_push($acc[$key], $obj);
return $acc;
}, []);
}
function groupby_having(array $a, string $prop, callable $c) {
return array_reduce($a, function($acc, $obj) use ($prop, $c) {
if (call_user_func($c, $obj)) {
$key = $obj[$prop];
if (!array_key_exists($key, $acc)) {
$acc[$key] = [];
}
array_push($acc[$key], $obj);
}
return $acc;
}, []);
}
// test:
$people = [
['id'=>1, 'name'=>'Alice', 'age'=> 21, 'gender'=>'f'],
['id'=>2, 'name'=>'Max', 'age'=> 20, 'gender'=>'m'],
['id'=>3, 'name'=>'Jack', 'age'=> 20, 'gender'=>'m'],
['id'=>4, 'name'=>'Jane', 'age'=> 22, 'gender'=>'f'],
['id'=>5, 'name'=>'Steven', 'age'=> 21, 'gender'=>'m']
];
$groupedPeople = groupby($people, 'age');
// var_dump($groupedPeople);
echo json_encode($groupedPeople).PHP_EOL;
$groupedPeople = groupby($people, 'gender');
echo json_encode($groupedPeople).PHP_EOL;
$groupedPeople = groupby_having($people, 'gender', function($row) {
return $row['age']>20;
});
echo json_encode($groupedPeople).PHP_EOL;
* run:
C:\Users\mingzhanghui\Downloads>php groupby.php
{"21":[{"id":1,"name":"Alice","age":21,"gender":"f"},{"id":5,"name":"Steven","age":21,"gender":"m"}],"20":[{"id":2,"name":"Max","age":20,"gender":"m"},{"id":3,"name":"Jack","age":20,"gender":"m"}],"22":[{"id":4,"name":"Jane","age":22,"gender":"f"}]}
{"f":[{"id":1,"name":"Alice","age":21,"gender":"f"},{"id":4,"name":"Jane","age":22,"gender":"f"}],"m":[{"id":2,"name":"Max","age":20,"gender":"m"},{"id":3,"name":"Jack","age":20,"gender":"m"},{"id":5,"name":"Steven","age":21,"gender":"m"}]}
{"f":[{"id":1,"name":"Alice","age":21,"gender":"f"},{"id":4,"name":"Jane","age":22,"gender":"f"}],"m":[{"id":5,"name":"Steven","age":21,"gender":"m"}]}