构造一个foreach循环

时间:2014-05-30 19:45:28

标签: php mysql foreach

我正在尝试使用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查询和结果,这总是组中的最后一个。

1 个答案:

答案 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>