PHP创建带有键的值数组

3
我可以帮助您进行翻译。以下是涉及IT技术的内容,您需要创建一个表格来显示数据库中的数据列表。但是这些值并没有按行存储在表格中,而是每个值都有自己的列。
以下是示例数据:
ID  Email           Value    
1   david@a.com     ABC    
1   david@a.com     DEF    
1   david@a.com     GHI    
2   jonathan@a.com  ABC    
2   jonathan@a.com  DEF    
2   jonathan@a.com  GHI

我希望将其显示为:

我想将其呈现为:

ID  Email           Value1  Value2  Value3    
1   david@a.com     ABC     DEF     GHI    
2   jonathan@a.com  ABC     DEF     GHI

我的代码:

$query1 = "SELECT wp_users.ID, user_email, VALUE FROM wp_users LEFT JOIN wp_cimy_uef_data on wp_users.ID = wp_cimy_uef_data.USER_ID";
$listEmail = array();
$listValues = array();

// Start the Load
$statement = $db->query($query1);
if ( $statement->rowCount() == 0 )
{
    echo '<strong>List is Empty</strong>';
} else foreach($statement as $row):

    $ID = htmlspecialchars($row['ID']);
    $email = htmlspecialchars($row['user_email']);
    $value = htmlspecialchars($row['VALUE']);

    $listEmail = array_fill_keys($ID, $email);
    $listValues = array_fill_keys($ID, $value);

endforeach; 
mysqli_close($db);

print_r($listEmail);

3
使用 GROUP BY 和 GROUP_CONCAT()。 - Mark Baker
如果可能的话,我想用PHP来完成它。 - John Ayers
是的,你可以用PHP做到这一点,但最好的方法是通过更改查询来实现。我曾经在Oracle中做过类似的事情,最终使用了他们的PIVOT函数。我假设MySQL中也有类似的功能... - user1578653
遗憾的是,MySQL没有像Oracle的PIVOT和UNPIVOT那样的功能...也许下一个版本会有。 - Mark Baker
2个回答

3
SELECT wp_users.ID, wp_users.user_email, 
GROUP_CONCAT(wp_users.value) 
FROM wp_users LEFT JOIN wp_cimy_uef_data on wp_users.ID = wp_cimy_uef_data.USER_ID 
GROUP BY wp_users.user_email

使用GROUP_CONCAT函数将值列连接起来,并使用GROUP BY函数按user_email分组。


这确实有效,我感谢您,但是我希望用PHP来完成它,因为我想能够在以后删除这些值。比如说,如果其中一个值是值列表中的第三个字符串,我想要将其删除。此外,我还可以显示每一行的标题,以便更容易阅读和排序。 - John Ayers
你能不能只删除该用户ID的那个值?例如:DELETE 'ABC' FROM table WHERE ID = '1' - edwardmp
不好意思,这是为了报告需要保留数据,所以不能删除。 - John Ayers

2
您可以按照以下方式来构建您的循环:
$table_rows = array();

foreach($statement as $row) {
    $ID = htmlspecialchars($row['ID']);
    $email = htmlspecialchars($row['user_email']);
    $value = htmlspecialchars($row['VALUE']);

    if (empty($table_rows[$ID])) {
        $table_rows[$ID] = array(
            'email' => $email,
            'values' => array(),
        );
    }

    $table_rows[$ID]['values'][] = $value;

}

或者在您的查询中使用group by。

使用这种方法,我该如何以格式化的形式打印出内容?foreach ($table_rows as $value) { echo $value . "<br />"; } - John Ayers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接