Reputation: 113
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
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