数据透视表(关联数组)数据

问题描述 投票:0回答:1

我的数据库返回以下格式的数据:

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
        )
)
php arrays pivot-table
1个回答
0
投票

这只是一些相对基础的数组操作。这是一种方法:

$rows = [
    ['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' => 901, 'liked' => 1]
];

// Extract user and video ids
$users = array_unique(array_column($rows, 'user_id'));
$videos = array_unique(array_column($rows, 'video_id'));

// Initialize the table
foreach($users as $user_id)
{
    foreach($videos as $video_id)
    {
        $table[$user_id]['user_id'] = $user_id;
        $table[$user_id][$video_id] = 0;
    }
}

// Add the likes
foreach($rows as $row)
    $table[$row['user_id']][$row['video_id']] += $row['liked'];

$table = array_values($table);

print_r($table);

输出:

Array
(
    [0] => Array
        (
            [user_id] => 0
            [341] => 1
            [765] => 0
            [534] => 1
            [901] => 0
        )

    [1] => Array
        (
            [user_id] => 1
            [341] => 0
            [765] => 1
            [534] => 0
            [901] => 0
        )

    [2] => Array
        (
            [user_id] => 3
            [341] => 0
            [765] => 0
            [534] => 0
            [901] => 1
        )
)
© www.soinside.com 2019 - 2024. All rights reserved.