【问题标题】:Converting a flat multidimensional array into a hierarchical array -- for albums and photo将平面多维数组转换为分层数组——用于相册和照片
【发布时间】:2018-05-30 17:47:58
【问题描述】:

所以我试图列出每个相册包含单独照片的相册。这类似于每个类别包含帖子的类别。 我有两个数据库表,即“相册”和“照片”。 专辑表具有列 id、album_name 和album_description。 照片表有 id、photo_is_in、photo_name 和 photo_description 列。

我使用 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);

?>

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

【问题讨论】:

  • 你的解决方案有什么问题?
  • $grouping[$albumName['phot_is_in']] = $albumName[]; 更改为$grouping[$albumName['phot_is_in']][] = $albumName;
  • 嘿@Paul Spiegel,我需要每个主相册数组都包含相册id 和相册描述以及照片,其中每张照片都是包含photo_id、photo_description 和photo_name 等的数组。但我的解决方案只有将所有内容放在相册数组中,而每张照片都没有自己的位置
  • 谢谢,我已更正您指出的语法错误。但这并没有什么不同

标签: php mysql arrays multidimensional-array hierarchical-data


【解决方案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 在 cmets 中指出的那样,索引与问题中的预期结果不同。这不是一个错误。我就是这样做的。但是,如果您确实需要与问题中完全相同的结果,则可以将代码调整为:

$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

【讨论】:

  • 根据 OP 问题中的内联 cmets,仔细注意新键的“来源”。
  • @Paul Spiegel,我刚刚尝试了您的代码,但是相册_1 中缺少 photo_1.jpg 并且相册_2 中缺少 photo_3.jpg。
  • @PrinceBrucex 刚刚修复了照片的索引.. 参见演示。
  • @mickmackusa 我认为使用album_idphoto_id 作为索引比使用名称更合理。但是.. OP 应该理解答案并能够在需要时调整代码。
  • OP 提供了虚构数据。如果您不提供按要求执行的方法,您可能会浪费自己的时间。我只是想帮忙。随心所欲。
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多