假设您有一个 HTML 元素数组(按照它们的出现顺序)
$array = array(
1=>array( 'level' => 1, 'element' => '<div class="parent">'),
2=>array( 'level' => 2, 'element' => '<div class="child">'),
3=>array( 'level' => 3, 'element' => '<span class="child2">'),
4=>array( 'level' => 2, 'element' => '<div class="child">'),
5=>array( 'level' => 2, 'element' => '<div class="child">'),
6=>array( 'level' => 3, 'element' => '<span class="child2">'),
7=>array( 'level' => 4, 'element' => '<span class="child3">'),
);
你如何设计一个foreach 循环来找到关闭的HTML 标签的位置来输出一个字符串作为
<div class="parent">
<div class="child">
<span class="child2">
<span>
</div>
<div class="child">
</div>
<div class="child">
<span class="child2">
<span class="child3">
</span>
</span>
</div>
</div>
我的尝试是这样的
foreach($array as $e){
echo $e['element'];
$level = $e['level'];
if($level<=$previous_level) {
echo $closing;
$closing = '';
}
$closing.= '</'. $element . '>'; // which comes from parsed $e['element'];
$previous_level = $level;
}
最佳答案
你可以用栈来做,
$array = array(
1=>array( 'level' => 1, 'element' => '<div class="parent">'),
2=>array( 'level' => 2, 'element' => '<div class="child">'),
3=>array( 'level' => 3, 'element' => '<span class="child2">'),
4=>array( 'level' => 2, 'element' => '<div class="child">'),
5=>array( 'level' => 2, 'element' => '<div class="child">'),
6=>array( 'level' => 3, 'element' => '<span class="child2">'),
7=>array( 'level' => 4, 'element' => '<span class="child3">'),
);
$result = "";
$tags = []; // stack to store node end tag
$levels = []; // stack to store node level
foreach($array as $tag){
$level = $tag["level"];
$element = $tag["element"];
while(end($levels) >= $level){ // pop all Sibling and their child
array_pop($levels);
$result .= array_pop($tags);
}
$result .= str_pad("",$level-1,"\t") . $element . "\n";
array_push($tags, str_pad("",$level-1,"\t") . "</" .substr($element,1,strpos($element," ")-1) . ">\n");
array_push($levels,$level);
}
while(end($levels)){
array_pop($levels);
$result .= array_pop($tags);
}
echo $result;
结果,
php test.php
<div class="parent">
<div class="child">
<span class="child2">
</span>
</div>
<div class="child">
</div>
<div class="child">
<span class="child2">
<span class="child3">
</span>
</span>
</div>
</div>
关于php - 用于从 PHP 数组创建 HTML 标记的 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57440940/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在