dongtao9095 2014-05-30 19:45
浏览 18
已采纳

构造一个foreach循环

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']}\">" . "
";
        $groupId = $message['group_id'];
    }

    $string .= "<message id=\"{$message['message_id']}\"></message>" . "
";
}
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.

  • 写回答

1条回答 默认 最新

  • duanju7199 2014-05-30 20:04
    关注

    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']}\">" . "
    ";
            $groupId = $message['group_id'];
        }
    
        $string .= "<message id=\"{$message['message_id']}\">{$message['message']}</message>" . "
    ";
    }
    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>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。