ButtressCoral
ButtressCoral

Reputation: 113

Constructing a foreach loop

I'm trying to achieve the following output using PHP. I'm unsure if a cascading foreach approach is best, but I think not.

I refer to my previous question for which had useful replies: Foreach changed row.

<group id="1">
    <message id="1"></message>
    <message id="2"></message>
    <message id="3"></message>
</group>
<group id="2">
    <message id="4"></message>
    <message id="5"></message>
    <message id="6"></message>
</group>
<group id="3">
    <message id="7"></message>
    <message id="8"></message>
</group>

The MySQL results ($results) are such that one column is unique ('message_id'), while the other may share the same value as another ('group_id').

message_id |  group_id 

1          |  1        
2          |  1        
3          |  1         
4          |  2       
5          |  2         
6          |  2         
7          |  3         
8          |  3         

This is the PHP code I'm using:

$groupId = '';
foreach ($results as $message)
{
    if ($message['message_id'] !== $groupId)
    {
        if (!empty($groupId))
        {
            $string .= '</group>';
        }
        $string .= "<group id=\"{$message['group_id']}\">" . "\n";
        $groupId = $message['group_id'];
    }

    $string .= "<message id=\"{$message['message_id']}\"></message>" . "\n";
}
if (!is_null($groupId))
{
    $string .= '</group>';
}

return $string;

The above code only outputs a single <message> item, and, looking at my MySQL query and results, this is always the last one in the group.

Upvotes: 0

Views: 72

Answers (1)

bloodyKnuckles
bloodyKnuckles

Reputation: 12079

Change this:

if ($message['message_id'] !== $groupId)

to this:

if ($message['group_id'] !== $groupId)

Here's my test:

$results = array(
    array('message_id' => 1, 'group_id' => 1, 'message' => 'a'),
    array('message_id' => 2, 'group_id' => 1, 'message' => 'b'),
    array('message_id' => 3, 'group_id' => 1, 'message' => 'c'),
    array('message_id' => 4, 'group_id' => 2, 'message' => 'd'),
    array('message_id' => 5, 'group_id' => 2, 'message' => 'e'),
    array('message_id' => 6, 'group_id' => 2, 'message' => 'f'),
    array('message_id' => 7, 'group_id' => 3, 'message' => 'g')
);

$groupId = null;
foreach ($results as $message)
{
    if ($message['group_id'] !== $groupId)
    {
        if (!is_null($groupId))
        {
            $string .= '</group>';
        }
        $string .= "<group id=\"{$message['group_id']}\">" . "\n";
        $groupId = $message['group_id'];
    }

    $string .= "<message id=\"{$message['message_id']}\">{$message['message']}</message>" . "\n";
}
if (!is_null($groupId))
{
    $string .= '</group>';
}

echo $string;

Now I'm getting this:

<group id="1">
    <message id="1">a</message>
    <message id="2">b</message>
    <message id="3">c</message>
</group>
<group id="2">
    <message id="4">d</message>
    <message id="5">e</message>
    <message id="6">f</message>
</group>
<group id="3">
    <message id="7">g</message>
</group>

Upvotes: 1

Related Questions