I'm designing comment system, but there is some problem in my recursive function. If look at this code in below :
$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/>";
Above code, has this result :
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]
)
But it must have this result :
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]
)
How can i solve this function issue?
I think you are making a simple task complex .... a simple loop is enough
$final = array();
foreach ( $list as $value ) {
$final[] = !$value['parent']
? setParentStyleComment($value)
: setReplyStyleComment($value);
}
print_r($final);
Output
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
Recursion?
$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/>";
As the (complete) example shows, this is a simple array_map
operation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With