<?php
class Address {
public string $city;
public int $zip;
public function __construct(string $city, int $zip) {
$this->city = $city;
$this->zip = $zip;
}
}
class Person {
public string $name;
public int $age;
public Address $address;
public function __construct(string $name, int $age, Address $address) {
$this->name = $name;
$this->age = $age;
$this->address = $address;
}
}
function printPersons(array $people): void {
foreach ($people as $p) {
echo "{$p->name} | age: {$p->age} | city: {$p->address->city} | zip: {$p->address->zip}\n";
}
}
function sortPersons(array &$people): void {
usort($people, function(Person $a, Person $b) {
if ($a->address->city !== $b->address->city) {
return $a->address->city <=> $b->address->city;
}
if ($a->address->zip !== $b->address->zip) {
return $a->address->zip <=> $b->address->zip;
}
return $a->age <=> $b->age;
});
}
$people = [
new Person("Alice", 30, new Address("San Francisco", 42100)),
new Person("Bob", 40, new Address("Austin", 32000)),
new Person("Carol", 35, new Address("New York City", 42000)),
new Person("Dave", 25, new Address("Austin", 32000)),
new Person("Eve", 28, new Address("New York City", 61000)),
];
sortPersons($people);
printPersons($people);
/*
run:
Dave | age: 25 | city: Austin | zip: 32000
Bob | age: 40 | city: Austin | zip: 32000
Carol | age: 35 | city: New York City | zip: 42000
Eve | age: 28 | city: New York City | zip: 61000
Alice | age: 30 | city: San Francisco | zip: 42100
*/