I have SQL exercise where I should convert table data into a print sentence where every person has phone numbers. For example
Alice: n1 (person ID here is 1)
Alice: n2 (person ID here is 1)
Alice: n5 (person ID here is 4)
Bob: n3 (person ID here is 2)
Carol: n4 (person ID here is 3)
But instead Alice: n1 and Alice: n2
it should be Alice: n1, n2
. Alice: n5
has a different ID and we aren’t limited to a unique name. So we should get :
Alice: n1, n2
Alice: n5
Bob: n3
Carol: n4
I’m pretty sure I missed something since I’m getting each person phone(s) separately in $personList
require_once 'Person.php';
function statementToPersonList($stmt) {
$dictionary = [];
$personList = [];
foreach ($stmt as $row) {
$id = $row['id'];
$name = $row['name'];
$number = $row['number'];
$person = new Person($id, $name);
$key = array_search($id, array_column($personList, 'id'));
if (!$key) {
$person ->addPhone($number);
$personList[] = $person;
}else{
$personList[$key] ->addPhone($number);
}
}
return $personList;
addPhone()
is just a function in Person class file
public function addPhone($phone) {
$this->phones[] = $phone;
}
Maybe I should use up this $dictionary = []
array, to store values, but I’m still confused how should I do it then. Cannot use database to handle the concatenation.
Advertisement
Answer
A more efficient way to do this would be to index your array by ID. Your code becomes:
/**
* @return Person[]
*/
function statementToPersonList(iterable $stmt): array
{
$personList = [];
foreach ($stmt as $row) {
$id = $row['id'];
$name = $row['name'];
$number = $row['number'];
if (!isset($personList[$id])) {
$personList[$id] = new Person($id, $name);
}
$personList[$id]->addPhone($number);
}
return $personList;
}
Note: you can also return array_values($personList)
if you don’t want the array indexed by ID when retrieving it.