我有以下数组:
$myarray = array(
2 => array(
'id' => '2',
'parent_id' => '1',
),
4 => array(
'id' => '4',
'parent_id' => '2',
),
3 => array(
'id' => '3',
'parent_id' => '1',
),
1 => array(
'id' => '1',
'parent_id' => '0',
)
);
,目标是得到以下输出:
1
1.2
1.2.4
1.3
问题是我需要在没有递归的情况下完成。这是一种答案但是这些人在构建树而我需要的是字符串。我试图使用某种$basestring
变量来知道我在哪里,但如果没有递归,它仍然不起作用。有什么办法吗?
Thank you
UPD我的第一次尝试是:
foreach($myarray as $k=>$value){
if($value['parent_id'] == 0){
$string = '1';
$id = $value['id'];
$newarr[0] = $string;
$basestring = $string.'.';
}elseif($value['parent_id'] == 1){
$string = $basestring.$value['id'];
$id = $value['id'];
$newarr[$id] = $string;
}elseif($value['one'] == 2){
$string = $basestring.$value['parent_id'].'.'.$value['id'];
$id = $value['id'];
$newarr[$id] = $string;
}elseif($value['parent_id'] == 3){
$string = $basestring.$value['parent_id'].'.'.$value['id'];
$id = $value['id'];
$newarr[$id] = $string;
}elseif($value['parent_id'] == 4){
$string = $basestring.$value['parent_id'].'.'.$value['id'];
$id = $value['id'];
$newarr[$id] = $string;
}//etc...
}
}
,但显然它失败了,因为不可伸缩性。我需要编写从child到parent的迭代这里
一个迭代的解决方案可以是这样的:
foreach ($myarray as $x) {
$temp = $x;
$string = [];
while (true) {
$string[] = $temp['id']; // add current level id
if (!isset($myarray[$temp['parent_id']])) break; // break if no more parents
$temp = $myarray[$temp['parent_id']]; // replace temp with parent
}
$strings[] = implode('.', array_reverse($string));
// array_reverse is needed because you've added the levels from bottom to top
}
基本上对于数组的每个元素,创建一个临时副本,然后通过键找到它的父元素,并将临时副本设置为父元素,直到没有找到更多的父元素。将id添加到数组中,并在到达末尾时从数组中构建字符串。
这假设你的数组是有效的,因为它不包含循环引用(例如一个级别是它自己的祖先)。如果发生这种情况,为了防止无限循环,您可以在while循环中增加变量,并在达到合理的限制时中断。