首页 > 解决方案 > 展平多维数组1级php

问题描述

我正在为类别建立层次结构。

我正在使用递归函数来建立子父关系。这为每个孩子构建了一组嵌套的数组。

我想将此嵌套数组展平为 1 级。有很多方法可以完全展平多维数组,但我想为 JSON 重建数组,将每个类别 id名称一起维护在数组中。

我得到这个输出:

array(2) { 
    [0] => array(2) {
        ["id"] => int(223)    
        ["name"] => string(12) "child of top" 
        ["parent"] => int(222)
    }  
    [1] => array(1) {    
        [0]=> array(2) {      
            [id] => int(224)      
            ["name"] => string(21) "child of child of top"    
            ["parent"] => int(222)
        }
    }
}

但我想拥有:

array(2) { 
    [0] => array(2) {
        ["id"] => int(223)    
        ["name"] => string(12) "child of top" 
        ["parent"] => int(222)
    }  
    [1] => array(2) {      
        ["id"] => int(224)      
        ["name"] => string(21) "child of child of top"
        ["parent"] => int(223)
    }
}

然后我可以将其构建到正确的子父关系中。

这是我第一次构建这种结构,所以我对尝试正确格式化事物有点不知所措。

有什么建议可以推进这个吗?谢谢。

编辑添加功能

  function display_children($cat_id, $level) { 

            $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
            $stmt = $mysqli->prepare("SELECT id, content, parent_id 
                                        FROM table
                                            WHERE parent_id = ?
                                        ");
            $stmt->bind_param("i", $cat_id);
            $stmt->execute();
            $result = $stmt->get_result();
            $stmt->close();

            while( $row = $result->fetch_assoc() ) {
                $data_array[] = $row; 

                $data_array[] = display_children($row['id'], $level+1);
            }
            return $data_array;
        }

更多信息 第一个建议的答案并不完全存在,因为所有级别的孩子都没有被返回到父级别。

parent: int(229)\n
       recursion[0]: array(3) {\n  [\"id\"]=>\n  int(232)\n  [\"content\"]=>\n  string(7) \"level 4\"\n  [\"parent_id\"]=>\n  int(231)\n}\n
            array(2) {\n    [0]=>\n  array(3) {\n    [\"id\"]=>\n    int(231)\n    [\"content\"]=>\n    string(7) \"level 3\"\n    [\"parent_id\"]=>\n    int(229)\n  }\n  
                            [1]=>\n  array(3) {\n    [\"id\"]=>\n    int(232)\n    [\"content\"]=>\n    string(7) \"level 4\"\n    [\"parent_id\"]=>\n    int(231)\n  }\n}\n 
parent: int(228)\n
        recursion[0]: array(3) {\n  [\"id\"]=>\n  int(231)\n  [\"content\"]=>\n  string(7) \"level 3\"\n  [\"parent_id\"]=>\n  int(229)\n}\n
            array(2) {\n    [0]=>\n  array(3) {\n    [\"id\"]=>\n    int(229)\n    [\"content\"]=>\n    string(7) \"level 2\"\n    [\"parent_id\"]=>\n    int(228)\n  }\n  
                            [1]=>\n  array(3) {\n    [\"id\"]=>\n    int(231)\n    [\"content\"]=>\n    string(7) \"level 3\"\n    [\"parent_id\"]=>\n    int(229)\n  }\n}\n 
parent: int(227)\n
        recursion[0]: array(3) {\n  [\"id\"]=>\n  int(229)\n  [\"content\"]=>\n  string(7) \"level 2\"\n  [\"parent_id\"]=>\n  int(228)\n}\n
            array(2) {\n    [0]=>\n  array(3) {\n    [\"id\"]=>\n    int(228)\n    [\"content\"]=>\n    string(7) \"level 1\"\n    [\"parent_id\"]=>\n    int(227)\n  }\n  
                           [1]=>\n  array(3) {\n    [\"id\"]=>\n    int(229)\n    [\"content\"]=>\n    string(7) \"level 2\"\n    [\"parent_id\"]=>\n    int(228)\n  }\n}\n

JSON的最终输出:

   [{\"id\":228,\"content\":\"level 1\",\"parent_id\":227},{\"id\":229,\"content\":\"level 2\",\"parent_id\":228}]"

在循环中使用此检查:

  if( isset( $recursion[0] ) ){
      $data_array[] = $recursion[0];
         echo " parent: ";
         var_dump($cat_id)
         echo "recursion[0]: " 
         var_dump( $recursion[0], $data_array);
 }

我想我有答案:

if( isset( $recursion[1] ) ){
  $data_array = array_merge($recursion,$data_array);
} elseif ( isset( $recursion[0] ) ){
  $data_array[] = $recursion[0];
}

如果递归返回中的值超过 1 个,则递归返回子级的子级。不仅仅是当前父母的孩子。需要返回整个递归数组。然后将数组与当前父级合并。我还没有彻底测试过这个,但似乎进展顺利。

标签: phphierarchy

解决方案


如果结构如示例,则应该可以:

function display_children($cat_id, $level) { 

        $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die ("Error " . mysqli_error($conn));
        $stmt = $mysqli->prepare("SELECT id, content, parent_id 
                                    FROM table
                                        WHERE parent_id = ?
                                    ");
        $stmt->bind_param("i", $cat_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $stmt->close();

        while( $row = $result->fetch_assoc() ) {
            $data_array[] = $row; 
            $recursion = display_children($row['id'], $level+1);
            if(isset($recursion['id']))
               $data_array[] = $recursion;
            elseif(isset($recursion[0]))
               $data_array[] = $recursion[0];
            else
               //manage error
        }
        return $data_array;
    }

推荐阅读