php从数组元素构建字符串

时间:2016-08-26 17:55:42

标签: php arrays multidimensional-array

我有以下数组:

$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...
  }
}

但显然由于不可扩展性而失败。我需要以某种方式编码从子到父的迭代

1 个答案:

答案 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循环中增加一个变量,如果它达到一个合理的限制就会中断。