【问题标题】:Nesting hierarchical data into an array - PHP (Codeigniter)将分层数据嵌套到数组中 - PHP (Codeigniter)
【发布时间】:2020-05-01 15:45:45
【问题描述】:

我一直在尝试解决这个问题,但有点困难。问题是,我正在尝试将下表中的数据按照它们相关的顺序嵌套到一个数组中。

+-----+------+------------+
| 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'
                        )
                   )
                )
            );

我希望从这些方法返回的数据位于键值对中,但是当我在 getDataAsBinaryTree(1) 方法上进行 var_dump 时,它反而返回了一个只有键的数组。我认为问题出在递归,但我只是不知道如何解决它。

结果

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

【问题讨论】:

  • 旁注:如果这个层次结构可以有两个以上的孩子,不要将方法命名为getDataAsBinaryTree
  • 一次获取所有数据,然后创建数组以将 DB 调用的往返次数减少到 1。
  • @vivek_23 你介意给我样品吗?
  • 这个问题和this one有什么不同?
  • 键值对是什么意思? (您已经以分层方式检索数据)您可以发布示例预期输出吗?

标签: php sql codeigniter recursion


【解决方案1】:

老实说,我不完全理解你的问题,你应该提供输出代码的结构。但是正如您的函数 getDataAsBinaryTree 建议您尝试制作二叉树一样,如果是这种情况,那么这就是要走的路。

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

)

希望这对您有所帮助。 :)

【讨论】:

  • 如果有帮助,你应该知道我也不懂。哈哈。我刚刚添加了输出应该是什么样子。想你看看
  • 呵呵,哈哈。但是你应该明白,除非你自己不清楚你想要什么,否则人们将无法帮助你。快乐编码。 :)
  • 是的...我想我是在空中编码而不是实际使用我的笔记本电脑
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2015-10-02
  • 2022-11-08
  • 2014-07-09
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多