我想解析一个数组,得到一些信息并返回一个新的数组,但递归地我不知道这是怎么做的。
这是一个数组示例:
$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/",
]
答案 0 :(得分:1)
您想要将一个数组结构转换为另一个数组结构。它可以通过多种方式完成。
我决定将你的功能分成两部分,第一部分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;
}