如何在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>"; ?>
代码说明
- 收集唯一视频ID:通过
array_column提取所有视频ID,再用array_unique去重,得到透视表需要的所有列名。 - 初始化用户行:遍历原始数据,对每个首次出现的用户,创建包含
user_id和所有视频列(默认值0)的基础结构。 - 更新点赞状态:对用户已有的点赞记录,覆盖对应视频列的默认值。
- 格式转换:将以
user_id为键的关联数组转为索引数组,与期望输出结构一致。
内容的提问来源于stack exchange,提问作者Asis
相关产品推荐
相关产品推荐

