我有以下数组:
$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
问题是我需要在没有递归的情况下这样做。 Here是某种答案,但那里的人正在构建树,而我需要有字符串。我试图使用某种$basestring
变量来知道我在哪里,但是如果没有递归它仍然无效。任何想法如何做到这一点?
谢谢
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...
}
}
但显然由于不可扩展性而失败。我需要以某种方式编码从子到父的迭代
答案 0 :(得分:3)
迭代解决方案可以像这样工作:
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循环中增加一个变量,如果它达到一个合理的限制就会中断。