pppp
pppp

Reputation: 231

How can I regroup an array

I have the following query

$sql = 'SELECT  F.ID, F.name as famName,F.contactEmail,F.address,F.phone,F.sitting,
                M.date,M.time,M.meeting,
                P.name as partName,P.email,
                R.numAttendees,R.deltoken
        FROM    Registration R, meeting M,
                Participants P,Family F
        WHERE date = CURDATE() + INTERVAL 1 DAY
            AND R.participant = P.ID
            AND R.meeting= M.ID
            AND M.family = F.ID
        ORDER BY M.meeting';
$data = $pdo -> query($sql)->fetchAll(PDO::FETCH_GROUP);

which returns exactly what I need. However, I then need to use the same information grouped by email. Is there any way to do that, without requerying the database?

Upvotes: 0

Views: 121

Answers (1)

Jannes Botis
Jannes Botis

Reputation: 11242

$grouped_by_email = array();
foreach($data as $row) {
    if(!isset($grouped_by_email[$row['email']])) {
         $grouped_by_email[$row['email']] = array();
    }
    $grouped_by_email[$row['email']][] = $row;
}

This will create an array of arrays with the email as the key.

If you want to do this similar to the way "GROUP BY" works in SQL, then use this:

$grouped_by_email = array();
foreach ($data as $row) {
    if (!isset($grouped_by_email[$row['email']])) {
        $grouped_by_email[$row['email']] = $row;
    }
    else {
        $grouped_by_email[$row['email']] = aggregate($grouped_by_email[$row['email']], $row);
    }
}

function aggregate($existingValue, $newValue)
{
    // Here write the olumn you want to combine and how.
    $newValue['numAttendees'] += $existingValue['numAttendees'];
    return $newValue;
}

Upvotes: 3

Related Questions