php 数据透视表(关联数组)数据[重复]

djp7away  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(147)

此问题已在此处有答案

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
        )
)
r7xajy2e

r7xajy2e1#

$input = [
  [ 'user_id' => 0, 'video_id' => 341, 'liked' => 1 ],
  [ 'user_id' => 1, 'video_id' => 765, 'liked' => 1 ],
  [ 'user_id' => 0, 'video_id' => 534, 'liked' => 1 ],
  [ 'user_id' => 3, 'video_id' => 981, 'liked' => 1 ]
];

$result = [];

$video_ids = array_unique(array_column($input, 'video_id'));
$video_ids_flipped = array_combine($video_ids, array_fill(0, count($video_ids), 0));

foreach ($input as $item) {
  $user_id = $item['user_id'];
  if (!array_key_exists($user_id, $result)) {
    $result[$user_id] = ['user_id' => $user_id] + $video_ids_flipped;
  }
  $result[$user_id][$item['video_id']] = $item['liked'];
}

$result = array_values($result);
ibrsph3r

ibrsph3r2#

要在PHP中实现所需的pivot转换,可以创建一个自定义脚本来处理从数据库获取的数据。下面是一个用于透视数据的PHP脚本:

$data = [
['user_id' => 0, 'video_id' => 341, 'liked' => 1],
['user_id' => 1, 'video_id' => 765, 'liked' => 1],
['user_id' => 0, 'video_id' => 534, 'liked' => 1],
['user_id' => 3, 'video_id' => 981, 'liked' => 1]];
$result = [];
 if (!isset($result[$user_id])) {
    $result[$user_id] = ['user_id' => $user_id];
}`$result[$user_id][$video_id] = $liked;

}

$result = array_values($result);
print_r($result);

此脚本处理从数据库获取的数据并创建所需的透视格式。它将返回一个空的结果数组,遍历数据库行,并相应地填充结果数组。
现在回答你们的问题
为什么不更改数据库查询?当数据库模式或查询不在您的控制之下时,或者当您希望保持原始数据完整以用于其他目的时,通常最好在代码中执行此类转换。
“喜欢”总是1吗?根据你的描述,似乎“喜欢”总是1。如果它可以为0或false,则可以修改脚本,通过在结果数组中相应地设置值来处理这些情况。
如果多个user_id具有相同的video_id怎么办?此脚本覆盖特定user_id和video_id组合的值。如果您想聚合多个用户对同一个video_id的点赞,您可以修改脚本以添加点赞而不是覆盖。

相关问题