谁帮忙写个递归算法,实在太累了

GaoXX 2009-11-28 02:46:39
把一维关联数组搞成多维树形结构:

$tbl = array( 'b4' => 'b2',
'b1' => '',
'a2' => 'a1',
'b2' => 'b1',
'c1' => '',
'b3' => 'b2',
'a3' => 'a1',
'a1' => ''
);

转换成:

Array(
'a1' => Array(
'a2' => array(),
'a3' => array()
),
'b1' => Array(
'b2' => Array(
'b3' => Array(),
'b4' => Array()
)
),
'c1' => Array()
)


分不够可以再加。
...全文
259 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
GaoXX 2009-11-30
  • 打赏
  • 举报
回复
Thanks guys.

        public function parseNodes() {

$retArray = array();

foreach($this->arr_options as $key => $value) {

$curArr = array();
$value = $value['parentName'];
if($value) {
$curArr[$key] = array();
while (!empty($value)) {
$curArr = array($value => $curArr);
$value = $this->arr_options[$value]['parentName'];
}
} else {
$curArr[$key] = array();
}
$retArray = array_merge_recursive($retArray, $curArr);
}

$this->nodes = $retArray;
#print '<pre>';
print_r($this->nodes);
print_r($this->arr_options);
#print '</pre>';
}
young5335 2009-11-29
  • 打赏
  • 举报
回复
<?php
$tb1=array( 'b4' => 'b2',
'b1' => '',
'a2' => 'a1',
'b2' => 'b1',
'c1' => '',
'b3' => 'b2',
'a3' => 'a1',
'a1' => '',
);
$result=array();
foreach ($tb1 as $k=>$v)
if(!$v)
{
$result[$k]=array();
}
foreach ($result as $firstparent=>$v)
{
SearchChildren($result[$firstparent],$firstparent,$tb1,$result);
}
print_r($result);
function SearchChildren(&$parent,$parentname,$arr,&$result)
{
$children=array_keys($arr,$parentname);
$count=count($children);
if($children) {
$tmp=array_flip($children);
foreach ($tmp as &$v)
$v=array();
$parent=$tmp;
}
else $parent=array();
foreach ($children as $name=>$secondparent)
SearchChildren($parent[$secondparent],$secondparent,$arr,$result);
}
江南昆虫 2009-11-29
  • 打赏
  • 举报
回复

$tbl = array(
'b4' => 'b2',
'b1' => '',
'a2' => 'a1',
'b2' => 'b1',
'c1' => '',
'b3' => 'b2',
'a3' => 'a1',
'a1' => '',
'd1' => 'd2',//d1、d2互为上级
'd2' => 'd1',
'x2' => 'x1',//x1不存在
);
function arrpush(&$out_item,$out_key,$arr){
if ($out_key == current($arr)) {//找到上级就添加吧
$out_item[key($arr)] = array();
} elseif (!empty($out_item)) {//该输出单元有下级的话,看看下级有没有符合的
array_walk($out_item,__FUNCTION__,$arr);
}
}
$out = array();
$i=0;
while($tbl){
$i++;
foreach ($tbl as $key => $item) {
$out_old = $out;
if (empty($item)) {//单元值为空则直接输出
$out[$key] = array();
} elseif (!array_key_exists($item,$tbl)) {//看一下当前单元的上级是否已经输出
array_walk($out,'arrpush',array($key=>$item));//检测每个输出单元,看看哪个是上级
if ($out == $out_old) $out[$key] = array();//上级不存在的话作为根节点输出
} elseif ($i>=10) {//防止死循环,十次循环都没有找到上级的一律直接输出
$out[$key] = array();
}
if ($out != $out_old) unset($tbl[$key]);//每输出一个单元就在原数组中删除一个,直至全部输出
}
}
print_r($out);
GaoXX 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 foolbirdflyfirst 的回复:]
PHP code$tbl=array('b4'=>'b2','b1'=>'','a2'=>'a1','b2'=>'b1','c1'=>'','b3'=>'b2','a3'=>'a1','a1'=>''
);foreach($tblas$k=>$v)
{if($v)
{$o=$v;$kkk='';while($o)
{$kkk="[{$o}]".$kkk;$o=$tbl[$o];
}$kkk.="[{$k}]";eval('!$newArray'.$kkk.' && $newArray'.$kkk.' = array();');

}else!$newArray[$k]&&$newArray[$k]=array();

}echo"<pre>";print_r($newArray);
[/Quote]

恩,能实现,
不过不建议用eval,太难看了,error_reporting(E_ALL)的时候会出一大堆Notice,
我会给你40分的。


征求更好的方法。
foolbirdflyfirst 2009-11-28
  • 打赏
  • 举报
回复
$tbl = array(   'b4' => 'b2', 
'b1' => '',
'a2' => 'a1',
'b2' => 'b1',
'c1' => '',
'b3' => 'b2',
'a3' => 'a1',
'a1' => ''
);
foreach($tbl as $k=>$v)
{

if($v)
{
$o = $v;
$kkk = '';
while($o)
{
$kkk = "[{$o}]".$kkk;
$o = $tbl[$o];
}
$kkk .= "[{$k}]";
eval( '!$newArray'.$kkk.' && $newArray'.$kkk.' = array();');

}
else !$newArray[$k] && $newArray[$k] = array();

}
echo "<pre>";
print_r($newArray);
GaoXX 2009-11-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzty 的回复:]
咋会这样的奇怪的要求呢
如下数据不就死循环了?
PHP code$tbl=array('b4'=>'b2','b1'=>'b4','b2'=>'b1' );
[/Quote]

数据是我自己生成的,不会出现死循环。
dzxccsu 2009-11-28
  • 打赏
  • 举报
回复
呵呵,搞不懂!
tony-杨 2009-11-28
  • 打赏
  • 举报
回复
咋会这样的奇怪的要求呢
如下数据不就死循环了?

$tbl = array( 'b4'=>'b2', 'b1'=>'b4', 'b2'=>'b1' );

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧