递归解析多维php数组,进行更改并返回结果

时间:2016-10-09 11:21:46

标签: php arrays recursion multidimensional-array

我想解析一个数组,得到一些信息并返回一个新的数组,但递归地我不知道这是怎么做的。

这是一个数组示例:

$arr= array ( 
                0 => array ( 
                            'id'=> 0,
                            'dir_name' => '', 
                            'children' => array ( 
                                36 => array ( 
                                                'id'=>36,
                                                'dir_name' => 'dir 36', 
                                                'children' => array ( 
                                                    92 => array ( 
                                                                    'id'=>92,
                                                                    'dir_name' => 'dir 92', 
                                                                    'children' => array ( 
                                                                        93 => array ( 
                                                                                        'id'=>93,
                                                                                        'dir_name' => 'dir 93', ), ), ), 
                                                    94 => array ( 
                                                                    'id'=>94,
                                                                    'dir_name' => 'dir 94', 
                                                                    'children' => array ( 
                                                                        95 => array ( 
                                                                                        'id'=>95,
                                                                                        'dir_name' => 'dir 95', ), ), ), ), ), ), ), );

这是我的功能:

function all_dir($array,$id_selected=0,$pos=0,$tab_pos=[]) 
{
  $flat= [];

  foreach($array as $k=>$value) 
  {

    if (is_array($value)) 
        $flat = array_merge($flat, all_dir($value, $id_selected,$pos,$tab_pos));
    else 
    {
        if($k=="id")
        {
            $option='<option value="'.$value.'"';
            if($value==$id_selected)
                $option .=" selected ";

        }

        if($k=="dir_name")
        {
            $flat[] = $value;
            $tab_pos[$pos]=$value;

            $val='';
            for($i=0; $i<=$pos; $i++)
            {
                $val .= $tab_pos[$i].'/';
            }

            $option .='>'.$val.'</option>';

            echo $option;

            $pos++;
        }


    }

  }
  return $flat;
}

示例html代码:

<html>
    <body>

        <select name="" id="">
            <?php
                all_dir($arr, 93);
            ?>
        </select>
    </body>
</html>

我得到了什么:

<select id="" name="">
<option value="0">/</option>
<option value="36">/dir 36/</option>
<option value="92">/dir 36/dir 92/</option>
<option selected="" value="93">/dir 36/dir 92/dir 93/</option>
<option value="94">/dir 36/dir 94/</option>
<option value="95">/dir 36/dir 94/dir 95/</option>
</select>

我想要的是什么:

all_dir()会返回一个数组(并且不显示某些选项html代码):

 [
        "0" =>"/",
        "36" =>"/dir 36/",
        "92" =>"/dir 36/dir 92/",
        "93" =>"/dir 36/dir 92/dir 93/",
        "94" =>"/dir 36/dir 94/",
        "95" =>"/dir 36/dir 94/dir 95/",
]

1 个答案:

答案 0 :(得分:1)

您想要将一个数组结构转换为另一个数组结构。它可以通过多种方式完成。

我决定将你的功能分成两部分,第一部分get_dir以递归方式遍历数组并抓取重要数据(iddir_name),第二部get_dir_root进行转换你希望格式化的直接格式。

我还删除了$id_selected$pos$tab_pos个参数,因为您不会在新版本中使用它。

function get_dir($array, $names = [])
{
    $ret = [];

    foreach ($array as $k => $v)
    {
        $id = $v['id'];
        $name = $v['dir_name'];

        $ret[$id] = $names;
        $ret[$id][] = $name;

        if (!empty($v['children']))
        {
            $xret = get_dir($v['children'], $ret[$id]);

            foreach ($xret as $kk => $vv)
            {
                $ret[$kk] = $vv;
            }
        }
    }

    return $ret;
}

function get_dir_root($array)
{
    $ret = [];

    foreach (get_dir($array) as $k => $v)
    {
        $ret[$k] = implode ('/', $v);

        if ($ret[$k] == '')
            $ret[$k] = '/';
        else
            $ret[$k] .= '/';
    }

    return $ret;
}

Working example