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

redlz2500 2014-02-20 03:20:34
好吧……问题的名字有点儿扯……
有数组输入如下:

[{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
求教啊~
...全文
140 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
redlz2500 2014-02-21
  • 打赏
  • 举报
回复
昨天自己写的代码,测试可用未优化,但是用了后发现在实际存在中存在问题,所以放弃这种一次性读取全部数据然后后台组织的方式了。

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;
			}
		}
	}
}
Jim@luckeeinc.com 2014-02-20
  • 打赏
  • 举报
回复
建立一个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);

21,886

社区成员

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

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