我正在尝试使用PHP实现以下输出。我不确定级联的foreach方法是否最好,但我认为不是。
我参考我之前提出的有用回复的问题: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>
MySQL结果($ results)是一列唯一('message_id'),而另一列可能与另一列('group_id')共享相同的值。
message_id | group_id
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
6 | 2
7 | 3
8 | 3
这是我正在使用的PHP代码:
$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;
上面的代码只输出一个<message>
项,看看我的MySQL查询和结果,这总是组中的最后一个。
答案 0 :(得分:1)
改变这个:
if ($message['message_id'] !== $groupId)
到此:
if ($message['group_id'] !== $groupId)
这是我的测试:
$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;
现在我得到了这个:
<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>