Вложение иерархических данных в массив - PHP (Codeigniter) - PullRequest
0 голосов
/ 01 мая 2020

Я пытался решить это некоторое время, но это было немного сложно. дело в том, что я пытаюсь вложить данные из таблицы, приведенной ниже, в массив в том порядке, в котором они связаны.

+-----+------+------------+
| uid | name | supermember|
+-----+------+------------+
|   1 | A    |      0     |
|   2 | B    |      1     |
|   3 | C    |      1     |
|   4 | D    |      2     |
|   5 | E    |      3     |
|   7 | G    |      3     |
|   9 | H    |      4     |
|  10 | I    |      4     |
|  11 | J    |      7     |
+-----+------+------------+

Вот что я сделал:

public function getDataAsBinaryTree($id)
    {
        $this->db->where('uid', $id);
        $query = $this->db->get('binary_tbl');
        $result = [];
        if ($query->num_rows() > 0) {
            foreach ($query->result() as $k) {
                $result[$k->name] =  $this->tolevels($k->uid);
            }
         } else {
            $result = NULL;
         }
         return $result;  
    }   



    private function tolevels($id)
    {
        $this->db->where('supermember', $id);
        $query = $this->db->get('binary_tbl');
        $output = [];
        $count = $query->num_rows();
        if ($query->num_rows() > 0) {
            foreach ($query->result() as $key) {
                $output[$key->name] = (($count > 1) ? $this->tolevel($key->uid) : $this->tolevel($key->uid));
            }
        } 
        return $output;
    }

ОЖИДАЕМЫЙ ВЫХОД


array(
        'A' => array(
                'B' => array(
                    'D' => array(
                       'H' => 'H',
                        'I' => 'I'
                       )
                     ),
                 'C' => array(
                     'E' => null,
                      'G' => array(
                         'J' => 'J'
                        )
                   )
                )
            );

Я хочу, чтобы возвращаемые данные из этих методов были в паре ключ-значение, но вместо этого он возвращал массив только с ключами, когда я var_dump в методе getDataAsBinaryTree(1) , Я думаю, что проблема в рекурсии, но я просто не знаю, как ее обойти.

РЕЗУЛЬТАТ

array (size=1)
  'A' => 
    array (size=2)
      'B' => 
        array (size=1)
          'D' => 
            array (size=2)
              ...
      'C' => 
        array (size=2)
          'E' => 
            array (size=0)
              ...
          'G' => 
            array (size=1)
              ...

1 Ответ

0 голосов
/ 02 мая 2020

Честно говоря, я не совсем понимаю ваш вопрос, вы должны предоставить структуру выходного кода. Но поскольку ваша функция getDataAsBinaryTree предполагает, что вы пытаетесь создать двоичное дерево, в таком случае это путь к go.

public function getDataAsBinaryTree($id = false){

    // $this->db->where('uid', $id);
    $query  = $this->db->get('binary_tbl');
    $result = [];

    if ($query->num_rows() > 0) {
        foreach ($query->result() as $k) {
            $result[$k->name] =  $this->tolevels($k->uid);
        }
    } else {
       $result = NULL;
    }
    // return $result;
    echo '<pre>'; print_r($result);  
}

private function tolevels($id){

    $this->db->where('supermember', $id);

    $query  = $this->db->get('binary_tbl');
    $output = [];
    $count  = $query->num_rows();

    if ($query->num_rows() > 0) {
        foreach ($query->result() as $key) {
            // $output[$key->name] = ($count > 0) ? $this->tolevels($key->uid) : $key->uid;
            $output[$key->name] = $key->uid;
            if($count > 0){ $this->tolevels($key->uid); };
        }
    } 
    return $output;
}

ВЫХОД

Array
(
    [A] => Array
        (
            [B] => 2
            [C] => 3
        )

    [B] => Array
        (
            [D] => 4
        )

    [C] => Array
        (
            [E] => 5
            [G] => 6
        )

    [D] => Array
        (
            [H] => 7
            [I] => 8
        )

    [E] => Array
        (
        )

    [G] => Array
        (
        )

    [H] => Array
        (
            [J] => 9
        )

    [I] => Array
        (
        )

    [J] => Array
        (
        )

)

Надеюсь, это поможет вам. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...