有效地为多个PHP foreach循环使用相同的代码

时间:2015-05-14 16:18:04

标签: php arrays loops foreach

我有一些经过foreach循环的不同数据集。每个foreach循环中的许多代码都是相似的,几乎完全相同,但是我使用基于先前定义的数组的变量以及放入foreach循环的初始数据。有没有办法将这些循环组合成某种函数而不必将所有数据传递给函数?

意思是,我可以在循环中定义一个函数并让它以某种方式使用该数据吗?我需要这样做,因为如果我只想显示那些具有关联数据的行,我会循环使用数据。但是如果我想显示所有行是否存在关联数据,那么我需要使用不同的数组来循环。

我需要为else执行两个单独的循环,因为它需要获取特定于此排列的所有排列和布局项的布局项,然后如果有数据我需要显示它一种方式,如果它是空的,我需要做一些不同的事情,所以我也必须检查它。

以下是使用相同数据的多个循环的示例:

if($hideempty == 'hide'){
    foreach($bannerArray as $bannerID => $records){
         foreach($records as $id => $record){ ?>
              <tr>
                  <td><?php echo $record['layout_name']; ?></td>
                  <td><?php echo $record['company_name']; ?></td>
               </tr>
          <?php }
     }
 } else {
      $layoutGroupArray = mysqli_fetch_assoc(mysqli_query($link, "SELECT `set_layout_group` FROM `SetTopics` WHERE `set_id` = $setID"));
      $layoutGroup = $layoutGroupArray['set_layout_group'];
      foreach($banners[0] as $bannerID => $layoutInfo){
          if(isset($bannerArray[$bannerID])){
              foreach($bannerArray[$bannerID] as $id => $record){ ?>
                  <tr>
                      <td><?php echo $record['layout_name']; ?></td>
                      <td><?php echo $record['company_name']; ?></td>
                  </tr>
               <?php }
           } else { ?>
               <tr>
                   <td><?php echo $layoutInfo['layout_name']; ?></td>
                   <td>empty</td>
               </tr>
           <?php }
       }
       foreach($banners[$layoutGroup] as $bannerID => $layoutInfo){
           if(isset($bannerArray[$bannerID])){
               foreach($bannerArray[$bannerID] as $id => $record){ ?>
                   <tr>
                       <td><?php echo $record['layout_name']; ?></td>
                       <td><?php echo $record['company_name']; ?></td>
                   </tr>
               <?php }
           } else { ?>
               <tr>
                   <td><?php echo $layoutInfo['layout_name']; ?></td>
                   <td>empty</td>
               </tr>
           <?php }
       }
  }

它不一定是我使用的功能,但我不确定如何有效地编写此代码。我正在做很多重复,但我无法想出另一种方法来访问我需要的数据而不重复这些。

4 个答案:

答案 0 :(得分:2)

这应该可以解决问题,它的代码重构为2个函数,一个用于创建单个行,另一个用于循环遍历数组以创建多个。

 <?php
    function createTableRow($layout_name, $company_name){
        $tablerow = "
            <tr>
                <td>".$layout_name."</td>
                <td>".$company_name."</td>
            </tr>   
        ";
        return $tablerow
    }

    function printTableRows($banners){
        foreach($banners as $bannerID => $layoutInfo){
            if(isset($bannerArray[$bannerID])){
              foreach($bannerArray[$bannerID] as $id => $record){ 
                 echo createTableRow($record['layout_name'], $record['company_name']);
              }
            } else { 
                echo createTableRow($record['layout_name'], "");
            }
        }
    }
    if($hideempty == 'hide'){
        foreach($bannerArray as $bannerID => $records){
             foreach($records as $id => $record){
                  echo createTableRow($record['layout_name'], $record['company_name']);
             }
         }
     } else {
          $layoutGroupArray = mysqli_fetch_assoc(mysqli_query($link, "SELECT `set_layout_group` FROM `SetTopics` WHERE `set_id` = $setID"));
          $layoutGroup = $layoutGroupArray['set_layout_group'];
          printTableRows($banners[0]);
          printTableRows($banners[$layoutGroup]);
     }

 ?>

答案 1 :(得分:1)

为什么不使用功能?

function layout_company($layout, $company) { ?>
<tr>
    <td><?=$layout?></td>
    <td><?=$company?></td>
</tr>
<?php }

function show_records(array $records) {
    foreach($records as $id => $record) {
        layout_company($record['layout_name'], $record['company_name']);
    }
}

if(hideempty == 'hide') {
    foreach($bannerArray as $bannerID => $records) {
        show_records($records);
    }
} else {
    function show_banners(array $banners, array $bannerArray) {
        foreach($banners as $bannerID => $layoutInfo) {
            if(isset($bannerArray[$bannerID])) {
                show_records($bannerArray[$bannerID]);
            } else {
                layout_company($layoutInfo['layout_name'], 'empty');
            }
        }
    }

    $layoutGroupArray = mysqli_fetch_assoc(mysqli_query($link, "SELECT `set_layout_group` FROM `SetTopics` WHERE `set_id` = $setID"));
    $layoutGroup = $layoutGroupArray['set_layout_group'];

    show_banners($banners[0], $bannerArray);
    show_banners($banners[$layoutGroup], $bannerArray);
}

答案 2 :(得分:1)

你可以重构它以使用辅助函数来回显tr标记,例如

function displayTableRow($layout, $company) {

echo "<tr>
    <td>$layout</td>
    <td>$company</td>
</tr>";
}

并在你的foreach循环中使用它,如:

      if(isset($bannerArray[$bannerID])){
          foreach($bannerArray[$bannerID] as $id => $record){ 
              displayTableRow($record['layout_name'], $record['company_name']);
          }
       } else {
              displayTableRow($record['layout_name'], 'empty');
          }
       }

答案 3 :(得分:0)

会是这样的(未经测试!

<?php
function getTableRecords ($array, $condition = NULL) {
    foreach($array as $key => $value) {
        if (!is_null ($condition)) { 
            foreach($value as $subKey => $subValue) {
                $result = "<tr><td>" .  
                           $subValue['layout_name']  . "</td><td>"  .  
                           $subValue['company_name'] . "</td></tr>";
            }
        }
        else {
            return "<tr>
                        <td>" . $value['layout_name'] . "</td>
                        <td>empty</td>
                    </tr>";
        }
    }
}

if($hideempty == 'hide'){
    print getTableRecords ($bannerArray);
} else {
    $layoutGroupArray = mysqli_fetch_assoc(mysqli_query($link, "SELECT `set_layout_group` FROM `SetTopics` WHERE `set_id` = $setID"));
    $layoutGroup = $layoutGroupArray['set_layout_group'];
    print getTableRecords ($banners[0],
                        isset ($bannerArray[$bannerID]) ? $bannerArray[$bannerID] : NULL);
    print getTableRecords ($banners[$layoutGroup],
                        isset ($bannerArray[$bannerID]) ? $bannerArray[$bannerID] : NULL);
}