此问题已在此处有答案:
Pivot a mysql result set and create html table/matrix(3个答案)
Create a 'pivot' table from array [duplicate](2个答案)
How to make PIVOT(Crosstab) in html and php(1个答案)
MySQL dynamic cross tab(1个答案)
Create a pivot comparison table based on site dates(1个回答)
4天前关闭。
我的数据库返回了以下格式的数据:
user_id | video_id | liked
0 341 1
1 765 1
0 534 1
3 981 1
我需要把这个表转换成下面的形式:
user_id | 341 | 765 | 534 | 981
0 1 0 1 0
1 0 1 0 0
3 0 0 0 1
我所做的是为每个用户ID创建一行,为每个视频ID创建一列,0应该是默认值,除非视频被喜欢。
在我最初的测试和实验中,我使用了python的pandas库,如下所示:
df = pd.read_csv('data.csv')
pivoted_df = df.pivot_table(
index='user_id',
columns='video_id',
values='liked',
fill_value=0,
)
pivoted_df.to_csv('pivoted_data.csv')
这很容易,工作完美,但现在我需要在php中做同样的事情,我找不到任何pandas替代品。我见过的其他解决方案对列使用键名,但在这里不起作用,因为列可以是任何数字。
为了清楚PHP中的实际数据结构,从数据库中获取的数据如下所示:
Array
(
[0] => Array
(
[user_id] => 0
[video_id] => 341
[liked] => 1
)
[1] => Array
(
[user_id] => 1
[video_id] => 765
[liked] => 1
)
[2] => Array
(
[user_id] => 0
[video_id] => 534
[liked] => 1
)
[3] => Array
(
[user_id] => 3
[video_id] => 981
[liked] => 1
)
)
它应该看起来像这样:
Array
(
[0] => Array
(
[user_id] => 0
[341] => 1
[765] => 0
[534] => 1
[981] => 0
)
[1] => Array
(
[user_id] => 1
[341] => 0
[765] => 1
[534] => 0
[981] => 0
)
[2] => Array
(
[user_id] => 3
[341] => 0
[765] => 0
[534] => 0
[981] => 1
)
)
2条答案
按热度按时间r7xajy2e1#
ibrsph3r2#
要在PHP中实现所需的pivot转换,可以创建一个自定义脚本来处理从数据库获取的数据。下面是一个用于透视数据的PHP脚本:
}
此脚本处理从数据库获取的数据并创建所需的透视格式。它将返回一个空的结果数组,遍历数据库行,并相应地填充结果数组。
现在回答你们的问题
为什么不更改数据库查询?当数据库模式或查询不在您的控制之下时,或者当您希望保持原始数据完整以用于其他目的时,通常最好在代码中执行此类转换。
“喜欢”总是1吗?根据你的描述,似乎“喜欢”总是1。如果它可以为0或false,则可以修改脚本,通过在结果数组中相应地设置值来处理这些情况。
如果多个user_id具有相同的video_id怎么办?此脚本覆盖特定user_id和video_id组合的值。如果您想聚合多个用户对同一个video_id的点赞,您可以修改脚本以添加点赞而不是覆盖。