求一维数组组织为“树形”数组的方法

WBOY
发布: 2016-06-23 14:01:46
原创
1114 人浏览过

好吧……问题的名字有点儿扯……
有数组输入如下:

[{id=>'00'},{id=>'01'},{id=>'22'},{id='0001'},{id=>'2234'}]
登录后复制

现在想将这个数组组织为以下形式:
[{id=>'00',children=>{{id=>'0001'}} },{id=>'01',children=>{} },{id=>'22',children=>{{id=>'2234'}} }]
登录后复制

其中的id是字符串,位数为双数位(2、4、6、8……),除了2位的id之外,其余位数的id总能找到上一级id(即元素A:2234必然能找到id为22【也就是left( 0,len(A[id])-2 )】的元素
虽然多次遍历也可行,但想能实现以下功能:
1、能正确地进行组织
2、每一次组织之后,原始数组会减少,比如第一次将2位的都处理了,那么在原始数组中id位数为2的其实就没有必要了,就全部unset
求教啊~


回复讨论(解决方案)

建立一个2维数组 array[id][child] 遍历一次原始数组就可以了
遇到两位的判断是否存在 不存在就插入 遇到不是两位的就认为是child放到该放的地方

$a = array('4401','00','0001','0002','22','2201');		$b = array();		for($i = 0; $i < count($a); $i++)		{		    if(strlen($a[$i]) == 2)		    {		        if(!array_key_exists($a[$i],$b))		        {		        		$b[$a[$i]] = array();		      	}			    }		    else		    {		        $id = substr($a[$i], 0, 2);		        if(isset($b[$id]))		        {				        if(!in_array($a[$i], $b[$id]))				        {				           $b[$id][] = $a[$i];					        }		      	}		      	else		      	{		      			$b[$id] = array();		      			$b[$id][] = $a[$i];    			      	} 			    }			}		print_r($b);
登录后复制

昨天自己写的代码,测试可用未优化,但是用了后发现在实际存在中存在问题,所以放弃这种一次性读取全部数据然后后台组织的方式了。

function sort_dep($deps){	//将无序的dep组合成为有序的树状结构	$step=2;	$start=1;	$res=array();	for($start=1;$start<5;$start++){		//大循环,即要处理的是第几级的数据		foreach($deps as $k => $v){			if(strlen($v['id'])==($start*$step)){				put_dep($res,$v);				unset($deps[$k]);			}		}			}	return $res;}function put_dep(&$res,$v){	//将数组放入到$res中去	$i=strlen($v['id']);	if($i==2){		$res[]=$v;	}else{		//需要查找是在什么下面的		$prefix=substr($v['id'],0,$i-2);				foreach($res as $key=>&$value){			if($value['id']==$prefix){				$value['children'][]=$v;   //children需在前面设置				return true;			}		}	}}
登录后复制

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板