Php 将数组解析为HTML结构的最有效方法

Php 将数组解析为HTML结构的最有效方法,php,html,arrays,loops,for-loop,Php,Html,Arrays,Loops,For Loop,为了简单起见,假设我有以下数组: $a = array(); $a[0]['lab'] = 1; $a[0]['name'] = 'test1'; $a[1]['lab'] = 1; $a[1]['name'] = 'test2'; $a[2]['lab'] = 2; $a[2]['name'] = 'test3'; $a[3]['lab'] = 2; $a[3]['name'] = "test4"; $a[4]['lab'] = 2; $a[4]['name'] = "test5"; 请记住

为了简单起见,假设我有以下数组:

$a = array();
$a[0]['lab'] = 1;
$a[0]['name'] = 'test1';
$a[1]['lab'] = 1;
$a[1]['name'] = 'test2';
$a[2]['lab'] = 2;
$a[2]['name'] = 'test3';
$a[3]['lab'] = 2;
$a[3]['name'] = "test4";
$a[4]['lab'] = 2;
$a[4]['name'] = "test5";
请记住,该数组的长度是完全可变的,与每个实验室相关的项目数量也可能会有所不同。每个实验室可能有一个,可能有100个

我想要的HTML结构如下所示:

<div class="parent"> <!-- Records for lab == 1 -->
  <div class="child">test1</div>
  <div class="child">test2</div>
</div>
<div class="parent"> <!-- Records for lab == 2 -->
  <div class="child">test3</div>
  <div class="child">test4</div>
  <div class="child">test5</div>
</div>

测试1
测试2
测试3
测试4
测试5
我目前有一个for循环,现在有一堆额外的逻辑,这是丑陋的/低效的,偶尔会错过最后一个“父”div的结束标记。我知道有一种更优雅的方法可以做到这一点,我很想看看其他人有什么想法

**编辑:

下面是我现在已经准备好的逻辑,它实际上适用于我抛出的测试用例,但它看起来很可怕:

<?php
$labId = 0;
for($i = 0; $i < count(a); $i++)
{
  if(($i+1) < count($a)) { $j = $i + 1;}
  if($labId == 0 || $labId != $a[$i]['lab'])
  {
    echo '<div class="parent">';
  }
  echo '<div class="child">'.$a['name'].'</div>';
  if(($a[$j]['lab'] != $labId && $a[$i]['lab'] != $labId && $labId != 0) || count($a) == 1)
  {
    echo '</div>';
  }
  $labId = $a[$i]['lab'];
}
?>

我会这样做:

$a = ... // copied from your code
$newArray = array();

foreach($a as $e){
    $newArray[$e['lab']][] = $e['name'];
}

foreach($newArray as $lab){
    echo "<div class=\"parent\">\n";
    foreach($lab as $child){
        echo "\t<div class=\"child\">".$child."</div>\n";
    }
    echo "</div>\n";
}
$a=…//从代码中复制
$newArray=array();
foreach($a作为$e){
$newArray[$e['lab'][]=$e['name'];
}
foreach($newArray作为$lab){
回音“\n”;
foreach($lab作为$child){
回显“\t”。$child.\n”;
}
回音“\n”;
}

希望这足够简单。

下面的代码可以在不创建新数组的情况下完成这项任务

foreach ($a as $key0 => $labs) {
    foreach ($labs as $key1 => $value) {
        if ($key1 == 'lab') {
            echo '<div class="parent">';
        } else {
            echo '<div class="child">'.$value.'</div>';
        }
    }

    //Close parent divs
    if (isset($key0['lab'])) {
        echo '</div>';
    }
}
foreach($a as$key0=>$labs){
foreach($key1=>$value){
如果($key1=='lab'){
回声';
}否则{
回显“.$value.”;
}
}
//关闭父div
如果(isset($key0['lab'])){
回声';
}
}

我的解决方案是将回答和其他一些尝试和错误结合起来

<?php
  // define original test array

  $a = array();
  $a[0]['lab'] = 1;
  $a[0]['name'] = 'test1';
  $a[1]['lab'] = 1;
  $a[1]['name'] = 'test2';
  $a[2]['lab'] = 2;
  $a[2]['name'] = 'test3';
  $a[3]['lab'] = 2;
  $a[3]['name'] = "test4";
  $a[4]['lab'] = 2;
  $a[4]['name'] = "test5";

  // new array has to be defined outside the foreach() loop, or it will be treated as a local var

  $anew = array();

  // for each entry, assign to $anew[lab#][next_avail_entry#]['name'] = <value>

  foreach ($a as $arec)
    $anew[$arec['lab']][]['name'] = $arec['name'];

  // output: one parent div for each lab, plus subdivs for as many values as are avail for each lab

  foreach ($anew as $alab)
  {
    printf("<div class=\"parent\">\n");
    foreach ($alab as $arec)
      printf("  <div class=\"child\">%s</div>\n", $arec['name']);
    printf("</div>\n");
  }
?>


*编辑:我发现的另一个解决方案是分别查询实验室和项目,并将实验室作为外部循环,项目作为内部foreach循环。

这不是一次钓鱼之旅-显示您所做的事情和遇到的困难。在您的项目中实现Smarty,改用{section}!我目前的逻辑已经被添加到问题中。当然效果很好,有没有一种优雅的方法可以做到这一点,而不必创建$newArray,只需使用$a?我这样问是因为实际数据包含的元素远不止“名称”,其中大约有10个。