我想解析一个数组,得到一些信息,并返回一个新的数组,但递归我不知道如何做到这一点。
下面是一个数组的例子:$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
递归地遍历数组并获取重要数据(id
和dir_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;
}
工作示例