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



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

下面是一个数组的例子:
$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/",
]

您想要将一个数组结构转换为另一个数组结构。有很多方法可以做到。

我决定将你的函数分成两个,第一个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;
}
工作示例

相关内容

  • 没有找到相关文章

最新更新