【问题标题】:Selectively flattening a PHP array according to parent keys根据父键选择性地展平 PHP 数组
【发布时间】:2009-05-11 14:07:11
【问题描述】:

我需要在 PHP 中选择性地展平数组,但要选择性地进行。如果键与模式匹配,则该键下方的所有子元素都应包含在“平面”输出中。

如果我有音乐目录:

=> 专辑数组 => 每个专辑都是歌曲标题数组

然后我可以搜索一个字符串,并得到一个平面数组作为响应。因此,如果我搜索“sun”,那么我会得到所有名称中包含“sun”的艺术家的整个目录,以及专辑名称中包含“sun”的其他艺术家的专辑。

希望这是有道理的。

大家有什么想法吗?

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您不使用数据库来存储大量信息是有原因的吗?在 SQL 中编写查询以提取您想要的数据是相当简单的。

    【讨论】:

      【解决方案2】:

      好的,我假设您的数据如下所示:

      $data = array(
          "Bill Withers" => array (
              "Lovely Day",
              "Use Me",
              "Ain't No Sunshine"
          ),
          "Fleet Foxes" => array (
              "Sun It Rises",
              "White Winter Hymnal"
          ),
          "Billy Joel" => array (
              "Piano Man"
          )
      );
      

      ...给定输入"Bill",您需要输出:["Lovely Day", "Use Me", "Ain't No Sunshine", "Piano Man"]。这是您可以做到的一种方法。

      function getSongs($data, $searchTerm) {
          $output = array();
          foreach ($data as $artist => $songs) {
              if (stripos($artist, $searchTerm) !== false)) {
                  $output = array_merge($output, $songs);
              }
          }
          return $output;
      }
      

      ...我还假设您有充分的理由不为此使用数据库。

      【讨论】:

        【解决方案3】:

        你是这个意思吗?

        $a = array(
            "Sunny" => "Bla-bla1",
            "Sun" => "Bla-bla2",
            "Sunshine" => "Bla-bla3",
        );
        
        foreach ($a as $k => $v) 
        {
         // check here whenever you want for $k
         // apply something to $v
         if ( ... )
              $b[$i++] = $v;
        }
        

        【讨论】:

          【解决方案4】:
          $sample_data = array(  
              'artist_name' => array(  
                  'album_name' => array(  
                      'song_name',  
                      'other_mp3_id_info'  
                      )
                  )  
              );
          
          function s2($needle,$haystack) {
          
              $threads = array();
              foreach ($haystack as $artist_name => $albums) {
                  if (stripos($artist_name, $needle) !== false)) {
                      $threads[] = $haystack[$artist_name];   //Add all artist's albums
                  } else {
                      foreach ($albums as $album_name => $songs) {
                          if (stripos($album_name, $needle) !== false)) {
                              $threads[$artist_name][] = $haystack[$album_name]; //add matching album
                          }
                      }
                  }
              }
              return $threads;
          }   
          

          【讨论】:

            【解决方案5】:

            为了建立 NickF 的工作,假设您的数据看起来像他的,我会这样编写函数。

            function getSongs($data, $searchTerm) {
                foreach ($data as $artist => $songs) {
                    if (stripos($artist, $searchTerm) !== false)) {
                        $output[$artist] = $songs;
                    }
                }
                return $output or null;
            }
            

            这个函数的结果,当没有找到匹配的时候,显然会返回null而不是一个空白数组;当找到几个匹配项时,他们将按他们的艺术家分组。根据我自己的经验,我发现直接分配 $output[$artist] = $songs 可以提供比 array_merge 更可预测的结果。 (这也保留了艺术家输出该数据。)

            就像 NickF 所说的,我认为您有充分的理由不使用数据库执行此操作?用于此的 SQL 将非常简单,例如,

            SELECT artist, song FROM songs WHERE artist LIKE '%Bill%' GROUP BY artist;
            

            【讨论】:

              【解决方案6】:

              您可以使用 preg_grep 进行搜索,但请务必清理输入:

              $matchingArtists = preg_grep('/' . preg_quote($searchString) . '/', array_keys($data));
              $matchingSongs = array();
              foreach ($data as $artist => $songs) {
                  $matchingSongs = array_merge($matchingSongs, preg_grep('/' . preg_quote($searchString) . '/', $songs));
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-04-08
                • 1970-01-01
                • 2013-09-12
                • 1970-01-01
                • 2013-01-24
                • 2017-02-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多