如何正确打印重复的行?

时间:2016-04-17 05:16:20

标签: php arrays html-table

我已经将旧的SO问题的mysql结果模拟为以下数组:

<?php
$arr = array(
           array(
            'title'=>'Test',
            'name'=>'ABC',
            'cat_desc'=>'ABC_DESC',
            'parent'=>0,
            'parent_menu'=>1
            ),
            array(
            'title'=>'Test2',
            'name'=>'DEF',
            'cat_desc'=>'DEF_DESC',
            'parent'=>0,
            'parent_menu'=>2
            ),
            array(
            'title'=>'Test2',
            'name'=>'GHI',
            'cat_desc'=>'GHI_DESC',
            'parent'=>1,
            'parent_menu'=>0
            ),
            array(
            'title'=>null,
            'name'=>'JKL',
            'cat_desc'=>'JKL_DESC',
            'parent'=>2,
            'parent_menu'=>0
            )
      );
    //print_r($arr);
    ?>

现在我想知道我是否可以用这种格式打印结果:

<table>
    <tr>
        <th>Name</th>
        <th>Description</th>
     </tr>

      <tr>            
         <td> Menu Title Test </td>
         <td> Main Category ABC</td>
      </tr>
        <tr>
          <td>GHI</td>
          <td>GHI_DESC</td>
      </tr>
       <tr>            
         <td> Menu Title Test2 </td>
         <td> Main Category DEF</td>
      </tr>
      <tr>
          <td>JKL</td>
          <td>JKL_DESC</td>
      </tr>
   </table>

我正在尝试使用以下php来打印,但它无法给出预期的结果:

<table>
    <tr>
        <th>Name</th>
        <th>Description</th>
     </tr>
  <?php 
  $r = 0;
  while(list($key, $val)=each($arr)) {
    if($val['parent']==0):            
     if($r % 1==0): ?>                      
      <tr>            
         <td> Menu Title <?php echo $val['title'];?> </td>
         <td> Main Category <?php echo $val['name'];?></td>
      </tr>
  <?php endif;        
    endif;                         
     if($val['parent']!=0){ ?>
      <tr>
          <td><?php echo $val['name'];?></td>
          <td><?php echo $val['cat_desc'];?></td>
      </tr>
<?php 
    }  
  $r++; 
 } ?>
   </table>

非常欢迎您的帮助和建议。

4 个答案:

答案 0 :(得分:2)

我发现很难从阵列结构中找出你想要的东西。但是我注意到数组元素0与元素2配对,元素1与元素3配对。因此我的代码就像下面一样。它会准确地为您提供所需的表格。

print "<table border=1>";

$numArray = count($arr) / 2;

for($i=0;$i<$numArray;$i++) {
    $element = $arr[$i];
    print "<tr><td>Menu Title {$element['title']}</td><td>Main Category {$element['name']}</td></tr>";
    $element = $arr[$i+2];
    print "<tr><td>{$element['name']}</td><td>{$element['cat_desc']} </td></tr>";
}

print "</table>";

答案 1 :(得分:1)

我发现来自关系数据库的数据并不能直接用于直接使用,并且需要一些按摩来降低代码复杂性。因此,如果您的目标是使用子菜单创建动态菜单,我建议将数据结构重构为更多的树结构,然后循环遍历每个级别。

更好的数据结构是:

$menus = array(   
  1 => array( // original array item index 0
    'title'=>'Test',
    'name'=>'ABC',
    'cat_desc'=>'ABC_DESC',
    'parent'=>0,
    'parent_menu'=>1
    'children'=> array( // new array containing submenus
      array( // original array item index 2
       'title'=>'Test2',
       'name'=>'GHI',
       'cat_desc'=>'GHI_DESC',
       'parent'=>1,
       'parent_menu'=>0
      ),
    ),
  ),
  2 => array( // original array item index 1
    'title'=>'Test2',
    'name'=>'DEF',
    'cat_desc'=>'DEF_DESC',
    'parent'=>0,
    'parent_menu'=>2
    'children'=> array( // array containing original item index 2
      array(
        'title'=>null,
        'name'=>'JKL',
        'cat_desc'=>'JKL_DESC',
        'parent'=>2,
        'parent_menu'=>0
      ),
    ),   
  ),
);

不仅仅是以这种更方便的形式输入数据,而是转换它是一种好习惯。因此,要从原始数据到此结构,您可以使用简单的单通道foreach循环:

$menus = [];
foreach($arr as $item) {
  if($item['parent'] == 0) {
    $item['children'] = array();
    $menus[$item['parent_menu']] = $item;
  }
  else {
    $menus[$item['parent']]['children'][] = $item;
  }
}

一旦你有一个很好的方便形式的数据,你可以使用简单的嵌套foreach循环来迭代它并以这样一个清晰的方式输出表:

<table>
    <tr>
        <th>Name</th>
        <th>Description</th>
    </tr>
    <?php foreach($menus as $menu) { ?>
        <tr>            
            <td> Menu Title <?php echo $menu['title'];?> </td>
            <td> Main Category <?php echo $menu['name'];?></td>
        </tr>
        <?php  foreach($menu['children'] as $child) { ?>
            <tr>
                <td><?php echo $child['name'];?></td>
                <td><?php echo $child['cat_desc'];?></td>
            </tr>
    <?php } } ?> 
</table>

答案 2 :(得分:1)

你可以在我评论该做什么以及为什么

的地方使用它
<table>
    <tr>
        <th>Name</th>
        <th>Description</th>
     </tr>
<?php 
// Store the array into temporary array 
$temp_array = $arr;
foreach ($arr as $akey => $sArr) 
{         
   // Check that prrent is 0 
   if ( $sArr['parent'] ==0 ) 
   {  
      // Store parent_menu id 
      $parent_menu = $sArr['parent_menu'];
   ?>
      <tr>            
         <td> Menu Title <?php echo $sArr['title'];?> </td>
         <td> Main Category <?php echo $sArr['name'];?></td>
      </tr>
      <?php 
      // Unset or remove current index from array 
      unset($temp_array[$akey]); 
      // Iterate all rows    
      foreach ($temp_array as $skey => $aval) 
      {          
         // Check that it has parent for the current menu
         if ( $aval['parent'] == $parent_menu ) 
         {
         ?>
            <tr>
                <td><?php echo $aval['name'];?></td>
                <td><?php echo $aval['cat_desc'];?></td>
            </tr>         
         <?php 
         }
      }
      // End of foreach
   }
   // End of if 
} 
// End of foreach 
?>
</table>

答案 3 :(得分:0)

从我看来,我相信$ r%2比$ r%1更有意义

如果$ r是整数,$ r%1将始终返回零。在您的情况下,您可以使用它来分割奇数和偶数的逻辑,这对您的数据集很有意义。

确保数据集不会更改。也许最好使用更可靠的方法。向数据集添加索引也不会对以下方面造成伤害:)