基于相同的键值对数组结果集进行分组

时间:2016-12-09 08:48:17

标签: php arrays

查询数据库后我有以下数组

$soundcloud_uploads=array(
array('release_id'=>33,'song_id'=>1,'artist_name'=>'omer aslam'),
array('release_id'=>33,'song_id'=>2,'artist_name'=>'omer aslam'),
array('release_id'=>34,'song_id'=>1,'artist_name'=>'Robbie')
);

我想要做的是根据release_id的相同值将数组转换为类似的内容。

$soundcloud_uploads=array(
    array(
      array('release_id'=>33,'song_id'=>1,'artist_name'=>'omer aslam'),
      array('release_id'=>33,'song_id'=>2,'artist_name'=>'omer aslam'),
    ),
    array('release_id'=>34,'song_id'=>1,'artist_name'=>'Robbie')
    );

目前我有以下代码使用foreach循环,它以某种方式实现了我想要的相同的东西

$soundcloud_uploads = array(
    array('release_id' => 33, 'song_id' => 1, 'artist_name' => 'omer aslam'),
    array('release_id' => 33, 'song_id' => 2, 'artist_name' => 'omer aslam'),
    array('release_id' => 34, 'song_id' => 1, 'artist_name' => 'Robbie')
);
$convert = array();
foreach ($soundcloud_uploads as $row) {
    $convert[$row['release_id']][] = $row;
}

,它提供以下输出

Array
(
    [33] => Array
        (
            [0] => Array
                (
                    [release_id] => 33
                    [song_id] => 1
                    [artist_name] => omer aslam
                )

            [1] => Array
                (
                    [release_id] => 33
                    [song_id] => 2
                    [artist_name] => omer aslam
                )

        )

    [34] => Array
        (
            [0] => Array
                (
                    [release_id] => 34
                    [song_id] => 1
                    [artist_name] => Robbie
                )

        )

)

但是我怎样才能使它更有效率和优化,因为结果会很大,如果我有1000条记录,那么我将不得不重复2000次一次安排将它们转换为所需的格式,然后以播放列表的形式发送/上传到soundcloud。

编辑:描述数据库架构以及为什么我无法通过mysql查询完成它的整个场景

我正在一个网站上工作,用户可以以发布/专辑的形式上传和分发他们的音乐到商店。然后,这些上传和批准的版本可以从一个表单发送/上传到soundcloud,他们可以选择将特定版本中的所有曲目上传为播放列表或将每首歌曲作为单独的曲目上传。

上传所选歌曲的时间

  1. 当他们点击保存时,他们可以选择当前日期立即上传。
  2. OR

    1. 他们可以选择日期来安排上传。
    2. 选定的曲目详细信息保存在名为的表中 soundcloud_upload将所有选定的曲目详细信息保存在release_id之内,这意味着如果我在一个版本中有5个曲目并选择上传所有曲目,则在点击保存时每个曲目详细信息将保存为单独的记录,表格的架构添加在下面。

      第一部分简单直接并实现,第二部分调度部分就是我现在的地方,涉及一个cron作业,它将每天运行并从soundcloud_upload表中选择与其他表连接的所有记录upload_datecurrent dateupload_type匹配的详细信息为scheduled。 我使用的查询和表模式如下

      SELECT `sc`.*, `rp`.*, `l`.`Name` AS `LabelName`, 
              `l`.`ContactName`, `l`.`ContactEmail`, `l`.`soundcloudUsername`, 
              `l`.`soundcloudPassword`, `l`.`youtubeUsername`, `l`.`youtubePassword`, 
              `mg`.`Name` AS `MainGenre`, `g`.`Genre`, `u`.`Username` FROM 
              `soundcloud_upload` AS `sc`
                   LEFT JOIN `ReleaseProd` AS `rp` ON sc.ReleaseId=rp.ReleaseId AND rp.Processed IS NOT NULL
                   LEFT JOIN `Label` AS `l` ON l.LabelId=rp.LabelId
                   LEFT JOIN `MainGenre` AS `mg` ON mg.MainGenreId=rp.MainGenreId
                   LEFT JOIN `Genre` AS `g` ON g.GenreId=rp.GenreId
                   LEFT JOIN `Users` AS `u` ON u.UserId=rp.UserId WHERE (sc.uploadDate='2016-12-10') AND 
          (l.soundcloudUsername IS NOT NULL) AND (l.soundcloudPassword IS NOT NULL) 
      AND (sc.upload_type='scheduled') AND 
              (sc.IsUploaded=0 OR sc.IsUploaded=2)
      

      确定我是否可以达到所需的结果集格式所需的表格架构如下所示。

      soundcloud_upload

      +----------------+-----------------------------+------+-----+---------+-------+
      | Field          | Type                        | Null | Key | Default | Extra |
      +----------------+-----------------------------+------+-----+---------+-------+
      | ReleaseId      | int(11)                     | NO   |     | NULL    |       |
      | SongId         | int(11)                     | NO   | MUL | NULL    |       |
      | isClip         | tinyint(1)                  | NO   |     | 0       |       |
      | trackName      | varchar(100)                | NO   |     | NULL    |       |
      | trackBio       | varchar(3000)               | YES  |     | NULL    |       |
      | category       | varchar(20)                 | YES  |     | NULL    |       |
      | tags           | varchar(3000)               | YES  |     | NULL    |       |
      | IsPlaylist     | tinyint(1)                  | NO   |     | 0       |       |
      | isPublic       | tinyint(1)                  | NO   |     | 0       |       |
      | isDownloadable | tinyint(1)                  | NO   |     | 0       |       |
      | PlaylistID     | int(11)                     | YES  |     | NULL    |       |
      | TrackID        | int(11)                     | YES  |     | NULL    |       |
      | purchaseUrl    | varchar(500)                | NO   |     | NULL    |       |
      | uploadDate     | date                        | NO   |     | NULL    |       |
      | createDate     | date                        | NO   |     | NULL    |       |
      | IsUploaded     | tinyint(1)                  | NO   |     | 0       |       |
      | clipStart      | varchar(10)                 | NO   |     | NULL    |       |
      | clipEnd        | varchar(10)                 | NO   |     | NULL    |       |
      | error_logs     | text                        | YES  |     | NULL    |       |
      | upload_type    | enum('instant','scheduled') | NO   |     | instant |       |
      +----------------+-----------------------------+------+-----+---------+-------+
      

      唱片集

      +----------------------------+-------------------------------+------+-----+-------------------+----------------+
      | Field                      | Type                          | Null | Key | Default           | Extra          |
      +----------------------------+-------------------------------+------+-----+-------------------+----------------+
      | ReleaseId                  | int(11)                       | NO   | PRI | NULL              | auto_increment |
      | Name                       | varchar(100)                  | NO   |     | NULL              |                |
      | UserId                     | int(11) unsigned              | NO   | MUL | NULL              |                |
      | rerelease                  | tinyint(1)                    | YES  |     | NULL              |                |
      | ReleaseNotes               | mediumtext                    | YES  |     | NULL              |                |
      | releaseDescription         | varchar(3000)                 | YES  |     | NULL              |                |
      | Catalog                    | varchar(20)                   | NO   |     | NULL              |                |
      | CoverFile                  | varchar(200)                  | YES  |     | NULL              |                |
      | AddDate                    | timestamp                     | NO   |     | CURRENT_TIMESTAMP |                |
      | ReleaseDate                | date                          | YES  |     | NULL              |                |
      | Howlong                    | int(11)                       | YES  |     | NULL              |                |
      | EffectiveDate              | date                          | YES  |     | NULL              |                |
      | iTunesPreOrderDate         | date                          | YES  |     | NULL              |                |
      | SoundcloudDate             | date                          | YES  |     | NULL              |                |
      | VariousArtists             | char(1)                       | YES  |     | NULL              |                |
      | ArtistId                   | int(11)                       | NO   | MUL | -1                |                |
      
      | Composer                   | varchar(255)                  | YES  |     | NULL              |                |
      | MainGenreId                | int(11)                       | YES  | MUL | NULL              |                |
      | GenreId                    | int(11)                       | YES  | MUL | NULL              |                |
      | Language                   | varchar(3)                    | NO   |     | en                |                |
      | SubgenreId                 | int(11)                       | YES  |     | NULL              |                |
      | UPCCode                    | varchar(13)                   | YES  | UNI | NULL              |                |
      | ReleaseType                | int(11)                       | YES  |     | NULL              |                |
      | TracksQty                  | tinyint(4)                    | YES  |     | NULL              |                |
      | PhysicalRelease            | char(1)                       | YES  |     | NULL              |                |
      | LabelId                    | int(11)                       | NO   | MUL | NULL              |                |
      

      标签

      +---------------------------+------------------+------+-----+---------------------+-----------------------------+
      | Field                     | Type             | Null | Key | Default             | Extra                       |
      +---------------------------+------------------+------+-----+---------------------+-----------------------------+
      | LabelId                   | int(11)          | NO   | PRI | NULL                | auto_increment              |
      | Name                      | varchar(50)      | NO   | UNI | NULL                |                             |
      | ContactName               | varchar(50)      | NO   |     | NULL                |                             |
      | ContactEmail              | varchar(100)     | NO   |     | NULL                |                             |
      | secondaryEmail            | varchar(255)     | NO   |     | NULL                |                             |
      | dob                       | date             | NO   |     | NULL                |                             |
      | ISRCCode                  | char(3)          | YES  |     | NULL                |                             |
      | Biography                 | text             | YES  |     | NULL                |                             |
      | CatalogBeginning          | int(3)           | NO   |     | 0                   |                             |
      | CatalogPrefix             | varchar(3)       | NO   |     | NULL                |                             |
      | AddressLine1              | varchar(50)      | YES  |     | NULL                |                             |
      | AddressLine2              | varchar(50)      | YES  |     | NULL                |                             |
      | City                      | varchar(30)      | YES  |     | NULL                |                             |
      | State                     | varchar(20)      | YES  |     | NULL                |                             |
      | Language                  | varchar(3)       | NO   |     | en                  |                             |
      | CountryID                 | int(11)          | NO   | MUL | NULL                |                             |
      | Juno                      | varchar(255)     | YES  |     | NULL                |                             |
      | TID                       | varchar(255)     | YES  |     | NULL                |                             |
      | Beatport                  | varchar(255)     | YES  |     | NULL                |                             |
      
      | mainGenreId               | int(11)          | NO   |     | NULL                |                             |
      | subGenreId                | int(11)          | NO   |     | NULL                |                             |
      
      | Hearaboutus               | varchar(80)      | NO   |     | NULL                |                             |
      | HearaboutusFriendName     | varchar(255)     | NO   |     | NULL                |                             |
      | HearaboutusFriendEmail    | varchar(255)     | NO   |     | NULL                |                             |
      | HearaboutusOthers         | varchar(255)     | NO   |     | NULL                |                             |
      | PromoBanner               | varchar(255)     | YES  |     | NULL                |                             |
      | Option4                   | tinyint(1)       | YES  |     | NULL                |                             |
      | package_plan              | tinyint(1)       | YES  |     | NULL                |                             |
      | royalty_percentage        | float            | NO   |     | NULL                |                             |
      | Threshold                 | float            | YES  |     | 200                 |                             |
      | Tagging                   | tinyint(1)       | YES  |     | NULL                |                             |
      | LogoFile                  | varchar(100)     | YES  |     | NULL                |                             |
      | PhoneNumber               | varchar(20)      | YES  |     | NULL                |                             |
      | SalesRate                 | decimal(10,4)    | YES  |     | NULL                |                             |
      | CurrencyId                | int(11)          | YES  | MUL | NULL                |                             |
      | UserId                    | int(11)          | NO   |     | NULL                |                             |
      | LastChangedBy             | int(11)          | NO   |     | NULL                |                             |
      | DateAdded                 | date             | YES  |     | NULL                |                             |
      | DateExpired               | date             | NO   |     | NULL                |                             |
      | paypal_time               | timestamp        | NO   |     | 0000-00-00 00:00:00 | on update CURRENT_TIMESTAMP |
      | isViewed                  | tinyint(1)       | NO   |     | 1                   |                             |
      | Active                    | tinyint(1)       | NO   |     | 1                   |                             |
      | agreement                 | varchar(255)     | NO   |     | NULL                |                             |
      | manual_agreement          | enum('Y','N')    | NO   |     | N                   |                             |
      | Signatures                | text             | NO   |     | NULL                |                             |
      | ein                       | varchar(128)     | NO   |     | NULL                |                             |
      | Neighbor                  | tinyint(4)       | NO   |     | NULL                |                             |
      | nbr_country               | int(11)          | NO   |     | NULL                |                             |
      
      +---------------------------+------------------+------+-----+---------------------+-----------------------------+
      

3 个答案:

答案 0 :(得分:1)

我认为将它分配给assosiative数组已经是你想要做的好方法,因为如果进程或代码逻辑变得复杂,那么你通过循环的数量并不重要,它将是相同的。

示例: 您的代码使用2000循环来完成您处理的作业

不知怎的,你设法重新编码并只使用1000循环来完成作业验证处理或分配新变量

这两种类型或过程需要时间,因为复杂性不同而没有太大差异

有时候更好地做更多的循环,而不是专注于如何使代码减少循环。

之前我确实面临过这个问题,然后在两个代码之间做基准测试,结果差别不大

希望这能帮到你

祝你好运

答案 1 :(得分:1)

如果您有1000条记录,我认为您没有严重问题。 2000次循环不是一件大事。但是如果您管理1 000 000或更多记录,则会遇到问题,因为PHP过程会变得太大(并且需要时间,是的)。

在我看来,当你有许多数据行要处理时,你必须将你的逻辑从内存改为数据库或文件,以避免在内存中管理太多的信息。

是否有办法将查询更改为数据库,以获取

  • 播放列表列表
  • 给定播放列表的内容?

更新:

根据您的数据库架构,表soundcloud_upload似乎(猜测!)包含播放列表和播放列表内容,两者之间的差异由属性IsPlaylist知道。

这是真的,要获得播放列表列表,您必须引入一个如下所示的where子句:WHERE sc.IsPlaylist = 1

要获取给定播放列表的内容,您必须知道其播放列表ID,并选择where子句,如下所示: WHERE sc.IsPlaylist = 0 and sc.PlaylistId = '$playListId'

答案 2 :(得分:0)

是的,你可以通过功能

来做到这一点
example



        $soundcloud_uploads=array(
        array('release_id'=>33,'song_id'=>1,'artist_name'=>'omer aslam'),
        array('release_id'=>33,'song_id'=>2,'artist_name'=>'omer aslam'),
        array('release_id'=>34,'song_id'=>1,'artist_name'=>'Robbie')
        );

       $soundcloud=array();
       $release_id_array=array();

       foreach($soundcloud_uploads as $sound) 
       {
         if($sound->release_id=='33')
        {
          $bbb=array();
          $bbb['release_id']=$sound->release_id;
          $bbb['song_id']=$sound->song_id;
          $bbb['artist_name']=$sound->artist_name;
          array_push($release_id_array,$bbb);
        }
       }
    //finally push array to main array 
     array_push($soundcloud,$release_id_array); 
     $release_id_array=array();
        foreach($soundcloud_uploads as $sound) 
       {
         if($sound->release_id=='34')
        {
          $bbb=array();
          $bbb['release_id']=$sound->release_id;
          $bbb['song_id']=$sound->song_id;
          $bbb['artist_name']=$sound->artist_name;
          array_push($release_id_array,$bbb);
        }
       }

        //finally push array to main array 
         array_push($soundcloud,$release_id_array);