[英]Recursion to generate HTML from nested array
我有以下数组。 我需要创建一个从此类数组构建HTML的函数。 我尝试了递归,但是我的逻辑中有错误。 请帮忙...
$arr = array(
'div' => array
(
0 => "Sample text sample text sample text.",
1 => array(
'ul' => array
(
'li' => Array
(
0 => "li 0 text.",
1 => "li 1 text.",
2 => "li 2 text."
)
)
)
)
);
所需的HTML输出为:
<pre>
<div>Sample text sample text sample text.</div>
<div>
<ul>
<li>li 0 text.</li>
<li>li 1 text.</li>
<li>li 2 text.</li>
</ul>
</div>
</pre>
我创建了以下函数:
echo parseHTML($arr, '<div>');
function parseHTML($arr, $parentKey) {
static $str = "";
foreach ($arr as $key => $value) {
if (is_array($value)) {
if (is_numeric($key)) {
parseHTML($value, $parentKey);
} else {
parseHTML($value, $key);
}
} else if (is_numeric($key)){
$str .= '<'.$parentKey.'>'.$value .'</' . $parentKey . '>';
} else {
$str .= '<'.$key.'>'.$value .'</' . $key . '>';
}
}
return $str;
}
我得到以下输出:
<div>Sample text sample text sample text.</div>
<li>li 0 text.</li>
<li>li 1 text.</li>
<li>li 2 text.</li>
这与@MaggsWeb解决方案的精神相同,但无论如何我都会将其发布:)
function printHtml($key, $value) {
if(!is_array($value) && is_numeric($key)) {
echo $value;
} else {
foreach($value as $k => $v) {
if(is_numeric($key)) {
printHtml($k, $v);
} else {
echo "<$key>";
printHtml($k, $v);
echo "</$key>";
}
}
}
}
echo '<pre>';
printHtml('p', $arr['p']);
echo '</pre>';
更新
这是一个返回字符串的版本。
function getHtml($key, $value) {
$s = '';
if(!is_array($value) && is_numeric($key)) {
return $value;
} else {
foreach($value as $k => $v) {
if(is_numeric($key)) {
return getHtml($k, $v);
} else {
$s .= "<$key>".getHtml($k, $v)."</$key>";
}
}
}
return $s;
}
echo '<pre>'.getHtml('p', $arr['p']).'</pre>';
这是一个递归函数,可以处理您的数组并输出上述示例。 它应该处理相同格式的多个数组元素。
echo '<pre>';
output($arr);
echo '</pre>';
function output($array){
foreach ($array as $key => $value){
if(is_array($value)){
foreach ($value as $item){
if(is_array($item)){
foreach ($item as $k => $v){
echo "<$k>";
if(is_array($v)){
output($v); // recursive
}
echo "</$k>";
}
} else {
echo "<$key>$item</$key>";
}
}
}
}
}
修改后,生成并返回一个字符串。
function outputString($array,$html=''){
foreach ($array as $key => $value){
if(is_array($value)){
foreach ($value as $item){
if(is_array($item)){
foreach ($item as $k => $v){
$html .= "<$k>";
if(is_array($v)){
$html .= outputString($v,$html);
}
$html .= "</$k>";
}
} else {
$html .= "<$key>$item</$key>";
}
}
}
}
return $html;
}
echo outputString($arr);
我已经测试过了:
function getHTML ($arr) {
$html="";
foreach ($arr as $a => $b) {
$html.="<pre><p>$b[0]</p>
<p><ul>";
foreach ($b[1] as $c => $d) {
foreach ($d as $e => $f) {
foreach ($f as $g) {
$html.="<li>$g</li>";
}
}
}
$html.="</ul></p>
</pre>";
}
return $html;
}
它恰好获得所需的html结构。 但这并不漂亮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.