converting a related database table object into a nested array - PHP

你说的曾经没有我的故事 提交于 2020-06-01 07:38:45

问题


i have some dummy related data in my table "you can take a look at it bellow". i want to nest the data according to their relationships into one array.

Table Data:

+-----+------+--------+
| 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 |
+-----+------+--------+

the array is going to be like array('A' =>array('B'=>'D','C'=>array(...)). am currently using codeigniter and here is what i've done

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

upon invoking the nestDataIntoArray(1) method i got the following output

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)

this output seems to be fine but i really dont want that Zero index and some of the data still has one or two data related to them which i still have to loop through to get and that to me just seems to be alot of unnecessary coding. So the question is: which other better way can i achieve this and how do i get rid of that zero index?

来源:https://stackoverflow.com/questions/61532396/converting-a-related-database-table-object-into-a-nested-array-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!