将一个扁平的多维数组转换为分层数组——用于相册和照片

3
我正在试图列出包含单个照片的相册,类似于每个分类包含帖子的方式。 我有两个数据库表,分别是“相册”和“照片”。 相册表包含id、相册名称和相册描述这些列。 照片表包含id、照片所在相册、照片名称和照片描述这些列。
我使用INNER JOIN将相册和照片表结合起来,生成了下面的平面$albums数组:
<?php

$albums  = [
['album_id' => '1', 'photo_id' => '41', 'album_name' => 'album_1', 'album_description' => 'Album 1 description', 'photo_is_in' => 'album_1', 'photo_name' => 'photo_1.jpg', 'photo_description' => 'Photo 1 description'],

['album_id' => '1', 'photo_id' => '42', 'album_name' => 'album_1', 'album_description' => 'Album 1 description', 'photo_is_in' => 'album_1', 'photo_name' => 'photo_2.jpg', 'photo_description' => 'Photo 2 description'],

//==================

['album_id' => '2', 'photo_id' => '43', 'album_name' => 'album_2', 'album_description' => 'Album 2 description', 'photo_is_in' => 'album_2', 'photo_name' => 'photo_3.jpg', 'photo_description' => 'Photo 3 description'],

['album_id' => '2', 'photo_id' => '44', 'album_name' => 'album_2', 'album_description' => 'Album 2 description', 'photo_is_in' => 'album_2', 'photo_name' => 'photo_4.jpg', 'photo_description' => 'Photo 4 description'],

];

?>

我希望将上面的$albums数组转换为下面这样的分层数组:
<?php

$sameAlbums = Array(

        'album_1' => Array( //comes from 'album_name' => 'album_1' in the $data array above
            'album_id' => '1',
            'album_description' => 'Album 1 description',
            'album_1' => Array( //comes from 'photo_is_in' => 'album_1' in the $data array above

                'photo_1.jpg' => Array( 
                    'photo_id' => '41',
                    'photo_description' => 'Photo 1 description',

                ), 


                'photo_2.jpg' => Array( 
                    'photo_id' => '42',
                    'photo_description' => 'Photo 2 description',

                ) 


            )

        ),

        //============================================

    'album_2' => Array( //comes from 'album_name' => 'album_2' in the $data array above
        'album_id' => '2',
        'album_description' => 'Album 2 description',
        'album_2' => Array( //comes from 'phot_is_in' => 'album_2' in the $data array above

            'photo_3.jpg' => Array( 
                'photo_id' => '43',
                'photo_description' => 'Photo 3 deescription',

            ), 


            'photo_3.jpg' => Array( 
                'photo_id' => '44',
                'photo_description' => 'Photo 4 deescription',

            ) 


        ) 

    ) 

);

?>

我曾尝试过类似的方法,但效果并不如预期,我需要帮助:
<?php
$grouping = [];
foreach($albums as $albumName){
    //Grouping data by album name
    $grouping[$albumName['album_name']][] = $albumName; 
}

echo "<pre>";
print_r($grouping);

?>

我感觉我的解决方案还不够,但是我又缺乏想法。


你的解决方案有什么问题? - Paul Spiegel
$grouping[$albumName['phot_is_in']] = $albumName[]; 改为 $grouping[$albumName['phot_is_in']][] = $albumName; - Paul Spiegel
嘿@Paul Spiegel,我需要每个主要的相册数组都包含相册ID和相册描述,以及照片,其中每个照片都作为一个数组包含照片ID、照片描述和照片名称等。但是我的解决方案只将所有内容放入相册数组中,而没有让每个照片拥有自己的数组。 - Prince Brucex
谢谢,我已经更正了你指出的语法错误。但是这并没有产生任何影响。 - Prince Brucex
1个回答

1
尝试类似这样的内容:
$grouping = [];
foreach($albums as $album) {
    if (!isset($grouping[$album['album_id']])) {
        $grouping[$album['album_id']] = [
            'album_id'          => $album['album_id'],
            'album_name'        => $album['album_name'],
            'album_description' => $album['album_description'],
            'photos' => []
        ];
    }
    $grouping[$album['album_id']]['photos'][$album['photo_id']] = [
        'photo_id'          => $album['photo_id'],
        'photo_name'        => $album['photo_name'],
        'photo_description' => $album['photo_description']
    ]; 
}

演示:http://rextester.com/GBW65553

但通常我会运行两个查询。首先获取相册并初始化空照片数组。然后获取照片并将它们分配给相关的相册。

正如@mickmackusa在评论中指出的那样,索引与问题中期望的结果不同。这不是一个错误。这就是我会这样做的方式。但如果你真的需要与你的问题完全一样的结果,你可以调整代码为:

$grouping = [];
foreach($albums as $album) {
    if (!isset($grouping[$album['album_name']])) {
        $grouping[$album['album_name']] = [
            'album_id'          => $album['album_id'],
            'album_name'        => $album['album_name'],
            'album_description' => $album['album_description'],
            $album['album_name'] => []
        ];
    }
    $grouping[$album['album_name']][$album['album_name']][$album['photo_name']] = [
        'photo_id'          => $album['photo_id'],
        'photo_name'        => $album['photo_name'],
        'photo_description' => $album['photo_description']
    ]; 
}

演示:http://rextester.com/LUZIG46060


@PrinceBrucex 刚刚修复了照片的索引.. 请查看演示。 - Paul Spiegel
@mickmackusa 我认为使用 album_idphoto_id 作为索引比使用名称更合理。然而,OP 应该理解答案并能够根据需要调整代码。 - Paul Spiegel
OP提供了虚构的数据。如果您不能提供所请求的方法,那么您可能会浪费自己的时间。我只是想帮忙。您可以随意处理。 - mickmackusa
@Paul Spiegel,新的解决方案立即打开和关闭album_1数组,而不包含任何照片。即'album_1' => array(); 'photos' =>();而不是'album_1' => array( //在此处添加照片...); - Prince Brucex
我将$grouping[$album['album_name']]['photos'][$album['photo_name']] = [更改为$grouping[$album['album_name']][$album['album_name']][$album['photo_name']] = [,现在一切正常。再次感谢您。您可能需要编辑解决方案。 - Prince Brucex
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接