Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP递归数组循环和格式化_Php_Recursion - Fatal编程技术网

PHP递归数组循环和格式化

PHP递归数组循环和格式化,php,recursion,Php,Recursion,我有一些PHP代码,我已经工作了好几天了。我试图从平面数组生成规则的格式化列表。我以前在这里得到过关于如何将平面数组转换为树数组的帮助,但我很难编写一个递归函数,该函数可以遍历平面数组,并在我希望规则成为打印标记的无序列表的成员的深度处成功地将其分解 <?php $data = array( '0' => 'Introduction', '4' => 'General', '4.1' => 'Chat',

我有一些PHP代码,我已经工作了好几天了。我试图从平面数组生成规则的格式化列表。我以前在这里得到过关于如何将平面数组转换为树数组的帮助,但我很难编写一个递归函数,该函数可以遍历平面数组,并在我希望规则成为打印标记的无序列表的成员的深度处成功地将其分解

<?php 
$data = array(
    '0'        => 'Introduction',
    '4'        => 'General',
    '4.1'      => 'Chat',
    '4.1.1'    => 'Do',
    '4.1.1.9'  => 'This',
    '4.1.1.10' => 'That',
    '4.1.1.11' => 'Other',
);

$struct = array(
    'children' => array()
);

foreach ($data as $ruleID => $content)
{
    $parent =& $struct;
    foreach (explode('.', $ruleID) as $val)
    {
        if (!isset($parent['children'][$val]))
        {
        $parent['children'][$val] = array(
                'content' => '',
                'children' => array()
            );
        }
        $parent =& $parent['children'][$val];
    }
    $parent['content'] = $content;
}


$out = '';
$rules = array_pop($struct);
format_rule($rules);
var_dump($rules);
echo $out;

function format_rule($arr, $depth=0)
{
    global $out;
    echo "depth: $depth\n";
    foreach($arr as $key => $val)
    {
        switch($depth)
        {
            case 0:
                $out .= '<h1>'.$val['content']."</h1><br />\n";
                break;
            case 1:
                $out .= '<h2>'.$val['content']."</h2><br />\n";
                break;
            case 2:
                $out .= '<h3>'.$val['content']."</h3><br />\n";
                break;
            default:
                $out .= '<li>'.$val['content']."</li>\n";
                break;
        }
        if(isset($val['children']) && count($val['children']) > 0)
        {
            if($depth > 2)
            {
                $out .= '<ul>';
                format_rule($val['children'], ++$depth);
                $out .= '</ul>';
            }
            else
            {
                format_rule($val['children'], ++$depth);
            }
        }
    }
}
目前的产出是:

<h1>Introduction</h1><br />
<h1>General</h1><br />
<h2>Chat</h2><br />
<h3>Do</h3><br />
<li>This</li><br />
<li>That</li><br />
<li>Other</li><br />
这很好,除了我的代码之外,我非常确定“Do”下的部分应该有一个围绕它的图标。

将代码更改为:

if($depth >= 2)
注意:请记住计数从0开始,而不是从1开始。

将代码更改为:

if($depth >= 2)
注意:请记住计数从0开始,而不是从1开始。

尝试以下方法:

<?php 
$data = array(
    '0'        => 'Introduction',
    '4'        => 'General',
    '4.1'      => 'Chat',
    '4.1.1'    => 'Do',
    '4.1.1.9'  => 'This',
    '4.1.1.10' => 'That',
    '4.1.1.11' => 'Other',
);

function get_level($key){
    return count(explode(".",$key));
}

function set_tag(&$array,$key,$item,&$ul_started){
    $level = get_level($key);
    switch($level){
        case 1:
        case 2:
        case 3:
            if($ul_started){
                $array[$key] = "</ul><h".$level.">".$item."</h".$level."><br>";
                $ul_started=false;
            }else{
                $array[$key] = "<h".$level.">".$item."</h".$level."><br>";
            }
        break;
        default:
            if(!$ul_started){
                $array[$key] = "<ul><li><strong>".$item."</strong></li><br>";
                $ul_started=true;
            }else{
                $array[$key] = "<li><strong>".$item."</strong></li><br>";
            }
        break;
    }
}

$ul_started = false;

foreach($data as $key=>$item){
    set_tag($data,$key,$item,$ul_started);
}

if($ul_started){
    $keys = array_keys($data);
    $data[$keys[count($data)-1]] .= "</ul>";
}

echo implode("",$data);
?>
试试这个:

<?php 
$data = array(
    '0'        => 'Introduction',
    '4'        => 'General',
    '4.1'      => 'Chat',
    '4.1.1'    => 'Do',
    '4.1.1.9'  => 'This',
    '4.1.1.10' => 'That',
    '4.1.1.11' => 'Other',
);

function get_level($key){
    return count(explode(".",$key));
}

function set_tag(&$array,$key,$item,&$ul_started){
    $level = get_level($key);
    switch($level){
        case 1:
        case 2:
        case 3:
            if($ul_started){
                $array[$key] = "</ul><h".$level.">".$item."</h".$level."><br>";
                $ul_started=false;
            }else{
                $array[$key] = "<h".$level.">".$item."</h".$level."><br>";
            }
        break;
        default:
            if(!$ul_started){
                $array[$key] = "<ul><li><strong>".$item."</strong></li><br>";
                $ul_started=true;
            }else{
                $array[$key] = "<li><strong>".$item."</strong></li><br>";
            }
        break;
    }
}

$ul_started = false;

foreach($data as $key=>$item){
    set_tag($data,$key,$item,$ul_started);
}

if($ul_started){
    $keys = array_keys($data);
    $data[$keys[count($data)-1]] .= "</ul>";
}

echo implode("",$data);
?>

当我离得这么近时,我觉得自己被打劫了,所以我就屈服了,来到了这里。我感觉自己被打劫了,因为我离得这么近,所以我屈服了,来到了这里。+1表示努力,但只要将depth>更改为>=然后给出默认标记,我的代码就可以按照我想要的方式工作。后续的深度会嵌入到更多更完美的内容中。是的,我只是想挑战自己。+1表示努力,但只要将深度>更改为>=然后给出默认标记,我的代码就会按照我想要的方式工作。后续的深度会嵌入到更完美的东西中。是的,我只是想挑战自己。