PHP рекурсивная функция для конкатенации строки - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь сделать файл CSV следующим образом:

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

Это в основном рекурсия, где у нас есть родители и дети. Пока я храню их в базе данных и могу извлечь их как двумерный массив. Проблема возникает, когда я пытаюсь создать строку для строк в файле CSV. До сих пор у меня есть это:

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;
        }

В результате массив, показанный ниже:

[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
        )
.......

У меня нет проблем с созданием файла CSV, но с вложенная конкатенация строки. Строка будет строить диаграмму дерева D3, и это предпочтительное форматирование, так как я не могу это контролировать. Я что-то упустил, но на данный момент я не уверен, что.

1 Ответ

1 голос
/ 07 апреля 2020

Это сложно проверить, но я думаю, что проблема в том, что вы добавляете к $str все время. Поэтому каждый раз, когда вокруг l oop, вы добавляете на него строку следующего уровня, в конечном итоге вы сбрасываете ее.

Вместо того, чтобы сделать это, требуется $str и добавляется дополнительная часть, назначая эту в новую строку и использует это значение, включая передачу его на следующий уровень ...

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;
}

Поскольку я не могу проверить это, проверить невозможно.

...