You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP按group_id分组展示RSVP数据:修复成员信息显示错误

问题

我有一个包含两张表的数据库,通过SQL查询获取关联数据并存入数组$rsvpData。现在需要打印该数据,将拥有相同group_id的团体/情侣/家庭合并展示,并列出每位成员的rsvp状态(每人有独立name_id,团体共享group_id),预期效果如下:

Billy Joel
- Billy Joel - 1

Doe Family
- John Doe - 1
- Jane Doe - 0

目前我写了foreach循环遍历所有ID,跟踪已处理项并跳过重复项,但在查找同一group_id下的关联成员时出现问题:代码能正确打印团体名称,且能找到对应数量的成员,但成员姓名和状态显示错误/偏移。使用$v作为键显然不正确,却不知道该替换成什么值。现有代码如下:

$alreadyProcessed = array();

foreach ($rsvpData as $k => $v) {
  if (!in_array($v["group_id"], $alreadyProcessed)) {
    echo "<p><strong>" . $v["invite_name"] . "</strong></p>";

    //Find all names/rsvpstatus
    $names = array_keys(array_column($rsvpData, 'group_id'), $v["group_id"]);
    foreach ($names as $name) {

      //Print name/rsvp status
      echo "<p>" . $v["name"] . " - " . $v["rsvp_status"] . "</p>";

      //Or maybe it's closer to this?
      echo "<p>" . $rsvpData[$v]["name"] . " - " . $rsvpData[$v]["rsvp_status"] . "</p>";
    }

    array_push($alreadyProcessed, $v["group_id"]);

    } else {
      //Already done, can skip.
    };
}

数组$rsvpData结构如下:

Array
(
    [1] => Array
        (
            [group_id] => 1
            [name_id] => 1
            [invite_name] => Billy Joel
            [name] => Billy Joel
            [rsvp_status] => 1
        )

    [2] => Array
        (
            [group_id] => 2
            [name_id] => 2
            [invite_name] => Doe Family
            [name] => John Doe
            [rsvp_status] => 1
        )

    [3] => Array
        (
            [group_id] => 2
            [name_id] => 3
            [invite_name] => Doe Family
            [name] => Jane Doe
            [rsvp_status] => 0
        )

    [4] => Array
        (
            [group_id] => 3
            [name_id] => 4
            [invite_name] => Clark Kent
            [name] => Clark Kent
            [rsvp_status] => 0
        )

    [5] => Array
        (
            [group_id] => 4
            [name_id] => 5
            [invite_name] => David Smith
            [name] => David Smith
            [rsvp_status] => 2
        )

    [6] => Array
        (
            [group_id] => 5
            [name_id] => 6
            [invite_name] => Chris & Julie
            [name] => Chris
            [rsvp_status] => 1
        )

    [8] => Array
        (
            [group_id] => 5
            [name_id] => 6
            [invite_name] => Chris & Julie
            [name] => Julie
            [rsvp_status] => 0
        )
)

请帮忙修正代码,使成员信息能正确显示。


修正后的代码及说明

问题核心是内部循环里一直复用外层的$v取数据,没有用找到的成员数组键去获取对应信息,同时存在重复输出的冗余代码。修正后的代码如下:

$alreadyProcessed = array();

foreach ($rsvpData as $k => $v) {
    if (!in_array($v["group_id"], $alreadyProcessed)) {
        // 打印团体名称
        echo "<p><strong>" . $v["invite_name"] . "</strong></p>";

        // 获取当前group_id下所有成员的数组键
        $memberKeys = array_keys(array_column($rsvpData, 'group_id'), $v["group_id"]);
        
        foreach ($memberKeys as $key) {
            // 通过键值获取对应成员的完整数据
            $member = $rsvpData[$key];
            echo "<p>- " . $member["name"] . " - " . $member["rsvp_status"] . "</p>";
        }

        // 标记该group_id已处理
        $alreadyProcessed[] = $v["group_id"];
    }
}

关键修正点:

  1. 将内部循环变量名改为$key,明确表示这是数组的索引键,避免语义混淆。
  2. 通过$rsvpData[$key]获取对应成员的真实数据,替代之前错误复用的外层$v。
  3. 移除重复输出语句,统一使用带- 前缀的格式匹配预期展示效果。
  4. 用$alreadyProcessed[] = ...替代array_push,写法更简洁高效。

运行这段代码后,就能得到符合预期的分组展示效果。

内容的提问来源于stack exchange,提问作者RobertN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:24:55