Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue in my recursive function

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?

like image 245
User Avatar asked Feb 18 '23 03:02

User


2 Answers

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

like image 78
Baba Avatar answered Feb 27 '23 00:02

Baba


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.

like image 22
hakre Avatar answered Feb 27 '23 00:02

hakre