преобразование связанного объекта таблицы базы данных во вложенный массив - PHP - PullRequest
0 голосов
/ 30 апреля 2020

У меня в таблице есть некоторые фиктивные данные: "Вы можете взглянуть на это ниже". я хочу вложить данные в соответствии с их отношениями в один массив.

Данные таблицы:

+-----+------+--------+
| uid | name | parent |
+-----+------+--------+
|   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 |
+-----+------+--------+

массив будет похож на array('A' =>array('B'=>'D','C'=>array(...)). в настоящее время я использую codeigniter и вот что я сделал

CODE

public function nestDataIntoArray($id)
    {
        $this->db->where('uid', $id);
        $query = $this->db->get('binary_tbl');
        $result = [];
        if ($query->num_rows() > 0) {
            foreach ($query->result() as $k) {
                // secondLevel deep
                $secondLevel = $this->getSubLevel($k->uid);
                $secondLevelRowCount = $secondLevel->num_rows();

                if ($secondLevelRowCount > 0 ) {
                    if ($secondLevelRowCount > 1) {
                        foreach ($secondLevel->result() as $key) {
                            // create second level deep array
                            $result[$k->name][$key->name][] = $this->getSubLevel($key->uid)->row('name');
                            // thirdLevel deep
                            $thirdLevel =  $this->getSubLevel($key->uid);
                            $thirdLevelRowCount = $thirdLevel->num_rows();

                            if ($thirdLevelRowCount > 0) {
                                if($thirdLevelRowCount > 1){
                                    foreach ($thirdLevel->result() as $tKey) {
                                        // create third level deep array
                                        $result[$k->name][$key->name][$tKey->name] = $this->getSubLevel($tKey->uid)->row('name');
                                    }

                                }else{
                                    foreach ($thirdLevel->result() as $tKey) {
                                        $result[$k->name][$key->name][$tKey->name] = $this->getSubLevel($tKey->uid)->row('name');
                                    }
                                }
                            } else {
                                $result[$k->name][$key->name] = $this->getSubLevel($key->uid)->result_array();
                            } //end thirdLevel deep
                        }
                    }   
                } else {
                    $result[$k->name] = $this->getSubLevel($key->uid)->row('name');
                } // end second level deep
            }
         } else {
            $result = NULL;
         }
         return $result;  
    }   

    private function getSubLevel($id)
    {
        return $this->db->select('*')->from('binary_tbl')->where('supermember', $id)->get();
    }

при вызове метода nestDataIntoArray(1) я получил следующий вывод

OUTPUT

array (size=1)
  'A' => 
    array (size=2)
      'B' => 
        array (size=2)
          0 => string 'D' (length=1)
          'D' => string 'H' (length=1)
      'C' => 
        array (size=3)
          0 => string 'E' (length=1)
          'E' => null
          'G' => string 'J' (length=1)

этот вывод выглядит нормально, но я действительно не хочу, чтобы нулевой индекс и некоторые данные все еще имели одну или две данные, связанные с ними, которые у меня все еще есть до l oop через, чтобы получить, и это мне просто кажется много ненужного кодирования. Итак, вопрос в том, каким другим лучшим способом я могу достичь этого и как мне избавиться от этого нулевого индекса?

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