2012-12-19 111 views
4

我在设计评论系统,但在我的递归函数中有一些问题。如果在这个代码看起来如下:问题在我的递归函数

$list = array(
      array('id'=>1,'parent'=>0), 
      array('id'=>2,'parent'=>1), 
      array('id'=>3,'parent'=>0), 
      array('id'=>4,'parent'=>0), 
      array('id'=>5,'parent'=>4), 
      array('id'=>6,'parent'=>4) 
     ); 

$c = count($list); 

$comment = array(); 

function setParentStyleComment($cmnt){ 
    return 'id: '.$cmnt['id'].' - parent: '.$cmnt['parent'].' - [PARENT]'; 
} 

function setReplyStyleComment($cmnt){ 
    return 'id: '.$cmnt['id'].' - parent: '.$cmnt['parent'].' - [REPLY]'; 
} 

function getComment($p) { 
    global $comment,$list,$c; 
    foreach($list as $L){ 
     if(($L['parent'] == 0 || $L['parent'] != $p) && $L['id'] != $p) 
     { 
      $comment[] = setParentStyleComment($L); 
      $x = $L['id']; 
      array_shift($list); 
      getComment($x); 
     } 
     else if($L['id'] != $p) 
     { 
      $comment[] = setReplyStyleComment($L); 
      $x = $L['id']; 
      array_shift($list); 
      if($x < $c){ 
       getComment($x); 
      } 
     } 
    } 
} 

getComment(0); 
echo "<pre>"; 
print_r($comment); 
echo "</pre>\n<br/>"; 

上述代码中,有这样的结果:

Array 
(
[0] => id: 1 - parent: 0 - [PARENT] 
[1] => id: 2 - parent: 1 - [REPLY] 
[2] => id: 3 - parent: 0 - [PARENT] 
[3] => id: 4 - parent: 0 - [PARENT] 
[4] => id: 5 - parent: 4 - [REPLY] 
[5] => id: 6 - parent: 4 - [PARENT] 
) 

但它必须有这样的结果:

Array 
(
[0] => id: 1 - parent: 0 - [PARENT] 
[1] => id: 2 - parent: 1 - [REPLY] 
[2] => id: 3 - parent: 0 - [PARENT] 
[3] => id: 4 - parent: 0 - [PARENT] 
[4] => id: 5 - parent: 4 - [REPLY] 
[5] => id: 6 - parent: 4 - [REPLY] 
) 

我怎样才能解决这个功能问题?

回答

2

递归?

$list = array(
    array('id' => 1, 'parent' => 0), 
    array('id' => 2, 'parent' => 1), 
    array('id' => 3, 'parent' => 0), 
    array('id' => 4, 'parent' => 0), 
    array('id' => 5, 'parent' => 4), 
    array('id' => 6, 'parent' => 4) 
); 

$comments = array_map(function($item) { 
    return sprintf(
     'id: %d - parent: %d - [%s]', 
     $item['id'], $item['parent'], $item['parent'] ? 'REPLY' : 'PARENT'); 
}, $list); 

echo "<pre>"; 
print_r($comments); 
echo "</pre>\n<br/>"; 

作为(完整)的例子所示,这是一个简单array_map操作。

+1

+1尼斯测绘技能... – Baba

+0

是的,需要删除虚假功能:) * gg * – hakre

+0

我无法想象所有那些长代码只是为了一个简单的任务 – Baba

6

我觉得你是一个简单的任务复杂....一个简单的循环就足够了

$final = array(); 
foreach ($list as $value) { 
    $final[] = !$value['parent'] 
       ? setParentStyleComment($value) 
       : setReplyStyleComment($value); 
} 

print_r($final); 

输出

Array 
(
     [0] => id: 1 - parent: 0 - [PARENT] 
     [1] => id: 2 - parent: 1 - [REPLY] 
     [2] => id: 3 - parent: 0 - [PARENT] 
     [3] => id: 4 - parent: 0 - [PARENT] 
     [4] => id: 5 - parent: 4 - [REPLY] 
     [5] => id: 6 - parent: 4 - [REPLY] 
) 

See Live Demo

+1

感谢这个答案,我真的想知道这个决定是什么,以及它更微不足道;)http://stackoverflow.com/a/13962565/367456 – hakre

+0

@Baba,你的代码不适用于任何输入。如果输入是这样的话会发生什么: '$ list = array(array('id'=> 1,'parent'=> 0),array('id'=> 2,'parent'=> 1),阵列( 'ID'=> 3 '父'=> 0),阵列( 'ID'=> 4, '父'=> 0),阵列( 'ID'=> 5, '父'=> 4) ,数组('id'=> 6,'pa​​rent'=> 0),array('id'=> 7,'parent'=> 4));' – return

+0

@Baba,以上输入的结果是: '数组 ( [0] => id:1 - parent:0 - [PARENT] [1] => id:2 - parent:1 - [REPLY] [2] => id:3 - parent:0 - [父母] [3] => id:4 - 父母:0 - [父母] [4] => id:5 - parent:4 - [REPLY] [5] => id:6 - parent: 0 - [PARENT] [6] => id:7 - parent:4 - [REPLY] )' – return