Foreach重复值

时间:2016-05-07 14:44:41

标签: php html mysql codeigniter

我正在研究文件共享系统。我的查询得到以下结果,当我使用print_r()时,我得到了所需的数据,但问题是我不知道如何将其显示为特定的格式

我的数据库架构..

table folder 

    ID    folder_name    path
    1     tep            dulay

table files 

       ID   file_name   path 
       1    1.jpg       dulay
       2    2.jpg       dulay

所需结果必须与dropbox.com类似

My files
tep folder         
1.jpg
2.jpg        

查询似乎是正确的,但是当我显示它时。输出如下。我认为原因是我有2个文件,这就是为什么它重复循环内的文件夹tpp。

My files    
tep folder            
tep folder
1.jpg 
2.jpg

我认为问题出在我的foreach循环中。

PHP代码..

    <table class="table table-hover">
        <th>Folder NAME</th>
        <th>FILES</th>
        <?php 
        foreach($my_files as $key )
        {
        ?>
        <tr>
            <td><?php echo $key->folder_name?></td>
            <td><a href="<?php echo base_url()?>filesharing/<?php echo $key->path?>/<?php echo $key->file_name?>" download="<?php echo $key->file_name;?>"><?php echo $key->file_name?></a></td>
        </tr>
        <?php 
        }
        ?>
    </table>

我的查询

$data['my_files'] = $this->db->select('folders.folder_name,files.file_name,files.owner,files.path')->from('folders')->join('files','files.path=folders.path','left outer')->where('folders.path',$url)->get()->result();

2 个答案:

答案 0 :(得分:1)

我假设所需的输出与您在第一个块中所述的相同

  **folder_name**    **file_name**   
          tep        1.jpg
                     2.jpg

您可以通过简单的方式实现此目的,您只需检查folder_name是否与同一阵列中的推送文件相同。

我假设你在mysql响应中有这个对象数组。

$mysql_response = Array ( 

[0] => stdClass Object ( 
        [folder_name] => tep 
        [file_name] => 1.jpg 
        [owner] => dulay 
        [path] => dulay )
[1] => stdClass Object ( 
        [folder_name] => tep 
        [file_name] => 2.jpg 
        [owner] => dulay 
        [path] => dulay ) 
);

PHP代码实现:

<?php

$filefolders = array();
foreach($mysql_response as $key => $fileObject){
     $filefolders[$fileObject->folder_name][] = $fileObject->file_name;
}

?>

HTML文件夹列表和每个文件夹中的所有文件。

<table>
<tr><th>Folder Name</th><th>File Name</th></tr>
<?php foreach($filefolders as $folder => $file){ ?> 
<tr>
  <td><?php echo $folder; ?></td>
  <td><?php echo $file; ?></td> 
</tr>
<?php } ?>

答案 1 :(得分:0)

我假设所需的输出与您在第一个块中所述的相同

  folder_name    file_name
  tep            1.jpg
                 2.jpg

OR

  folder_name    file_name
  tep            1.jpg
  jonnas           

尝试使用此代码,它会跟踪重复的文件夹和文件,以便此类文件夹和文件的名称只显示一次。

 <?php
    $prevFolder=null;
    $prevFile=null; 
    foreach($my_files as $key )
    {
      echo '<tr>';
     if($key->folder_name!=$prevFolder){
         echo '<td>'.$key->folder_name.'</td>';
         $prevFolder=$key->folder_name;
     }
     else{
          echo '<td></td>';
     }

     if($key->file_name!=$prevFile){
         echo '<td><a href="'.base_url().'filesharing/'.$key->path.'/'.$key->file_name.'" download="'.$key->file_name.'">'.$key->file_name.'</a></td>';
         $prevFile=$key->file_name;
     }
     else{
          echo '<td></td>';
     }
  ?> 

    </tr>
    <?php 
    }
    ?>

注意:始终实现正确的输出。建议结果按file_name或folder_name *

排序