把一维关联数组搞成多维树形结构:$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()
)
分不够可以再加。
'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()
)
分不够可以再加。
如下数据不就死循环了?$tbl = array( 'b4'=>'b2', 'b1'=>'b4', 'b2'=>'b1' );
'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);
恩,能实现,
不过不建议用eval,太难看了,error_reporting(E_ALL)的时候会出一大堆Notice,
我会给你40分的。
征求更好的方法。
$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);
}
$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);
$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>';
}