1

I'm trying to make a CSV file like this:

id,value
1,type
2,type.type A
3,type.type A.subtype 2000
4,type.type A.subtype 2000.subsubtype
5,type.type A.subtype 2000.subsubtype.subsubsubtype
6,type.type B

This is basically a recursion where we have parents and children. So far I have them stored in database and I can extract them as a two-dimensional array. The problem comes when I try to make the string for the rows in the CSV file. So far, I have this:

private function _criteriaRec(&$result, $parentId, &$str) {

            $relations = parent::getAll('objects_relations', 'id, object_id_2', ['object_id', $parentId, 'attr', 'criteria']); // here I'm extracting the objects from DB
            if(!empty($relations)){
                foreach ($relations as $relation) {
                    $object = parent::get('objects', 'id, title', '', $relation['object_id_2']);
                    $str .= ".$object[title]"; // I'm trying to make the string
                    $result[] = array(
                        'parent' => $parentId,
                        'child' => $relation['object_id_2'],
                        'title' => $object['title'],
                        'str' => $str
                    );
                    $this->_criteriaRec($result, $relation['object_id_2'], $str);
                    $str = ''; // I'm clearing the string at some point and I've moved this almost everywhere
                }
            }

            return $result;
        }

The result is the array shown below:

[0] => Array
        (
            [parent] => 17
            [child] => 33
            [title] => type
            [str] => .type
        )

    [1] => Array
        (
            [parent] => 33
            [child] => 34
            [title] => subtype B
            [str] => .type.subtype B
        )

    [2] => Array
        (
            [parent] => 33
            [child] => 35
            [title] => subtype A
            [str] => .subtype A
        )

    [3] => Array
        (
            [parent] => 35
            [child] => 36
            [title] => subsubtype
            [str] => .subtype A.subsubtype
        )
.......

I don't have a problem with the making of the csv file, but with the nested concatenation of the string. The string will build a D3 tree diagram and this is the preferred formatting as I don't have control over that. I'm missing something but at this point, I'm not sure what.

1 Answer 1

2

This is difficult to test, but I think the problem is that you are adding to $str all the time. So each time round the loop, you will add the next level string onto it, eventually you reset it.

Rather than do that, this takes $str and adds the extra part on, assigning this to a new string and uses this value, including passing it on to the next level...

private function _criteriaRec(&$result, $parentId, $str) {

    $relations = parent::getAll('objects_relations', 'id, object_id_2', ['object_id', $parentId, 'attr', 'criteria']); // here I'm extracting the objects from DB
    if(!empty($relations)){
        foreach ($relations as $relation) {
            $object = parent::get('objects', 'id, title', '', $relation['object_id_2']);
            $newStr = "$str.$object[title]"; 
            $result[] = array(
                        'parent' => $parentId,
                        'child' => $relation['object_id_2'],
                        'title' => $object['title'],
                        'str' => $newStr
            );
            $this->_criteriaRec($result, $relation['object_id_2'], $newStr);
        }
    }

    return $result;
}

As I can't test this, it's impossible to check.

Sign up to request clarification or add additional context in comments.

1 Comment

I knew It was something small and stupid! Thank you, very much for pointing it out!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.