将平面多维数组转换为分层数组——用于相册和照片
Converting a flat multidimensional array into a hierarchical array -- for albums and photo
所以我试图列出每个相册都包含单独照片的相册。这类似于每个类别包含帖子的类别。
我有两个数据库 table,即 "albums" 和 "photos"。
相册 table 有列 id、album_name 和 album_description。
照片 table 有列 id、photo_is_in、photo_name 和 photo_description。
我使用 INNER JOIN 组合相册和照片 table 生成下面的平面 $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 = [];
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']
];
}
所以我试图列出每个相册都包含单独照片的相册。这类似于每个类别包含帖子的类别。 我有两个数据库 table,即 "albums" 和 "photos"。 相册 table 有列 id、album_name 和 album_description。 照片 table 有列 id、photo_is_in、photo_name 和 photo_description。
我使用 INNER JOIN 组合相册和照片 table 生成下面的平面 $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 = [];
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']
];
}