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

如何在PHP中实现类似Pandas的用户点赞数据Pivot Table转换?

PHP实现动态列的数据透视表转换

需求说明

需要将从数据库获取的用户点赞数据转换为透视表格式:

  • 每个user_id对应一行
  • 每个video_id作为列名
  • 未点赞的项默认填充0

原始数据格式(数据库输出)

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

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

实现代码

以下是适配动态列的PHP实现方案,无需依赖第三方库:

<?php
// 模拟从数据库获取的输入数组
$inputData = [
    ['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],
];

// 收集所有唯一的video_id,作为透视表的列
$allVideoIds = array_unique(array_column($inputData, 'video_id'));
sort($allVideoIds); // 可选:对列名排序,保持顺序一致

// 构建用户基础数据,初始化所有video_id列值为0
$userData = [];
foreach ($inputData as $item) {
    $userId = $item['user_id'];
    // 首次遇到该用户时,创建包含所有视频列的基础行
    if (!isset($userData[$userId])) {
        $userRow = ['user_id' => $userId];
        foreach ($allVideoIds as $vid) {
            $userRow[$vid] = 0;
        }
        $userData[$userId] = $userRow;
    }
    // 更新当前用户对该视频的点赞状态
    $userData[$userId][$item['video_id']] = $item['liked'];
}

// 将关联数组转为索引数组,匹配期望输出结构
$outputData = array_values($userData);

// 打印结果验证
echo "<pre>";
print_r($outputData);
echo "</pre>";
?>

代码说明

  1. 收集唯一视频ID:通过array_column提取所有视频ID,再用array_unique去重,得到透视表需要的所有列名。
  2. 初始化用户行:遍历原始数据,对每个首次出现的用户,创建包含user_id和所有视频列(默认值0)的基础结构。
  3. 更新点赞状态:对用户已有的点赞记录,覆盖对应视频列的默认值。
  4. 格式转换:将以user_id为键的关联数组转为索引数组,与期望输出结构一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:50