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个。