簡體   English   中英

PHP多維父子數組-某些元素被覆蓋

[英]PHP Multidimensional Parent-Child Array- Certain Elements Being Overwritten

我很難從兩個數據庫表中生成父子樹。

它旨在引用其中的文件夾和文件。

我快到了,下面的代碼生成樹(從此處獲取 ),但是分配給包含子類別的類別的任何文件-它們不會顯示。

如何顯示它們?

這是目前正在發生的事情 在此處輸入圖片說明

這就是我想要發生的事情 在此處輸入圖片說明

我相信問題出在函數Generate_Tree_Of_Categories($ Tree_Data)。

function Generate_Tree_Of_Categories(array $elements, $parentId = "NONE")
{
    $branch = array();

    foreach ($elements as $element) {
        if ($element['child_of'] == $parentId) {
            $children = Generate_Tree_Of_Categories($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;

            }
            $branch[] = $element;
        } else {
          $element = null;
        }
    }

    return $branch;
}

這是我的數據庫表:

**Categories table:**
Reference       Title                   Type        Child_Of    Status
CAT202480   Software                    CATEGORY    NONE        ACTIVE
CAT893984   Product Manuals             CATEGORY    NONE        ACTIVE
CAT384594   Manufacturing               CATEGORY    NONE        ACTIVE
CAT394858   Manufacturing Manuals       CATEGORY    CAT384594   ACTIVE
CAT394811   Videos                      CATEGORY    NONE        ACTIVE
CAT111338   Product Videos              CATEGORY    CAT394811   ACTIVE
CAT339844   Commissioning Software      CATEGORY    CAT202480   ACTIVE
CAT339845   Release Versions            CATEGORY    CAT339844   ACTIVE
CAT339846   Beta Versions               CATEGORY    CAT339844   ACTIVE

**Files Table:**
Reference       Type        Title                       Category_Ref    Format  Status
FILE001393804   SOFTWARE    Beta software v0.9.3            CAT339846   ZIP     AVAILABLE
FILE001984843   DOCUMENT    Product A Installation Manual   CAT893984   PDF     AVAILABLE
FILE009039742   DOCUMENT    Product A Commissioning Guide   CAT893984   PDF     AVAILABLE
FILE683579248   DOCUMENT    Product A User Guide            CAT893984   PDF     AVAILABLE
FILE001393805   SOFTWARE    Product A software Release 1.9  CAT339845   ZIP     AVAILABLE
FILE001393803   SOFTWARE    Product Z program               CAT339844   ZIP     AVAILABLE

這是一個SQL轉儲

這是我的代碼,用於將上述數據轉換為與JSTree兼容的數組,我稍后將其命名為json_encode。

function Load_Downloads_TreeView()
{
    require '../../global/session_manager.php';
    require_once '../../permissions/permissions.php';

    // Determine the permissions for the current user
    $User_Permissions = Get_Permissions_SpecificUser($LoggedInUserReference, $LoggedInFlag);


    $Response = Retrieve_All_Download_Categories_SpecificStatus("ACTIVE", $LoggedInFlag);
    // $Response = Retrieve_All_Download_Categories($LoggedInFlag);
    if ($Response['Decision'] == TRUE) {
        $Download_Categories = $Response['Value'];
    } else {
        echo $Response['Notification'];
        exit();
    }


    // $Response          = Retrieve_Specific_Download_Category("CAT339845", $LoggedInFlag);
    // $Specific_Category = $Response['Value'];

    $Tree_Data = array();
    foreach ($Download_Categories as $Current_Category) {


              // This code returns an array of files assigned to the $Current_Category reference
              $Response = Retrieve_Files_In_Download_Category($Current_Category['Reference'], $LoggedInFlag);
              $Files    = $Response['Value'];
              $Child_Nodes = NULL;
              if (count($Files) > 0) {
                 $Child_Nodes = Return_Files($Files);
              }

            //$Child_Nodes would be filled with the array of files (array of arrays).

            // $Child_Nodes = NULL; //Until I figure out how to nest this information in a multidimensional array with categories

            $Response = Generate_Folder_Node($Current_Category['Reference'],$Current_Category['Name'],$Current_Category['Child_Of'], $Child_Nodes);

            $Tree_Data[] = $Response;

    }

    $Generated_Tree = Generate_Tree_Of_Categories($Tree_Data);

    echo json_encode($Generated_Tree);


}



function Generate_Folder_Node($Element_ID,$Element_Name,$Child_Of, $Child_Nodes) {
  if (!defined('id')) define('id', 'id');
  if (!defined('text')) define('text', 'text');
  if (!defined('type')) define('type', 'type');
  if (!defined('child_of')) define('child_of', 'child_of');
  if (!defined('children')) define('children', 'children');
  if (!defined('state')) define('state', 'state');
  if (!defined('opened')) define('opened', 'opened');
  $Node_Open_Array = array(opened=>"false");

  $Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"folder", child_of=>$Child_Of, children=>$Child_Nodes, state=>$Node_Open_Array);

return $Generated_Node;

}



function Return_Files($Child_Array)
{
  $All_Nodes = array();

    foreach ($Child_Array as $Current_Child_Element) {
        $Element_ID   = $Current_Child_Element['Reference'];
        $Element_Name = $Current_Child_Element['Name'];


        if ($Current_Child_Element['Status'] == "AVAILABLE") {
            $DisabledState = "false";
        } else if ($Current_Child_Element['Status'] == "UNAVAILABLE") {
            $DisabledState = "true";
        }

        if ($Current_Child_Element['File_Type'] == "PDF") {
            $Icon = "fa fa-file-pdf-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "ZIP") {
            $Icon = "fa fa-file-zip-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "JPG" || $Current_Child_Element['File_Type'] == "PNG") {
            $Icon = "fa fa-file-picture-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "XLS" || $Current_Child_Element['File_Type'] == "XLSX") {
            $Icon = "fa fa-file-excel-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "DOC" || $Current_Child_Element['File_Type'] == "DOCX") {
            $Icon = "fa fa-file-word-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "PPT" || $Current_Child_Element['File_Type'] == "PPTX") {
            $Icon = "fa fa-file-powerpoint-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "EXE") {
            $Icon = "fa fa-desktop fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "AVI" || $Current_Child_Element['File_Type'] == "MP4") {
            $Icon = "fa fa-file-video-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "MP3" || $Current_Child_Element['File_Type'] == "WAV") {
            $Icon = "fa fa-file-sound-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "TXT") {
            $Icon = "fa fa-file-text-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "HEX" || $Current_Child_Element['File_Type'] == "BIN") {
            $Icon = "fa fa-file-code-o fa-lg text-inverse";
        } else {
            $Icon = "fa fa-file fa-lg text-inverse";
        }

      $Generated_Node = Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState);

      if (is_array($Generated_Node) == true) {
        if (!empty($Generated_Node)) {
          array_push($All_Nodes, $Generated_Node);

        }
      }


      // $All_Nodes[] = $Child_Node;
    }

    return $All_Nodes;

}

function Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState) {

if (!defined('id')) define('id', 'id');
if (!defined('text')) define('text', 'text');
if (!defined('type')) define('type', 'type');
if (!defined('icon')) define('icon', 'icon');
if (!defined('state')) define('state', 'state');
if (!defined('opened')) define('opened', 'opened');
$Node_Open_Array = array(opened=>$DisabledState);

$Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"file", icon=>$Icon, state=>$Node_Open_Array);


return $Generated_Node;

}

它可能與Product Z程序的Category_Ref一樣簡單。 您擁有CAT339844。 不是CAT339846嗎?

我不知道這是否是您要尋找的東西,但我重寫了它,以便它提供此JSON輸出。 您如何將其轉換為結構的視覺顯示。 我看不到該代碼。

[
    {
        "id": "1",
        "text": "Software",
        "type": "folder",
        "Child_Of": "NONE",
        "children": [
            {
                "id": "7",
                "text": "Commissioning Software",
                "type": "folder",
                "Child_Of": "CAT202480",
                "children": [
                    {
                        "id": "8",
                        "text": "Release Versions",
                        "type": "folder",
                        "Child_Of": "CAT339844",
                        "children": [
                            {
                                "id": "FILE001393805",
                                "text": "Product A software Release 1.9",
                                "type": "file",
                                "icon": "fa fa-file-zip-o fa-lg text-inverse",
                                "state": {
                                    "opened": "false"
                                }
                            }
                        ],
                        "state": {
                            "opened": "false"
                        }
                    },
                    {
                        "id": "9",
                        "text": "Beta Versions",
                        "type": "folder",
                        "Child_Of": "CAT339844",
                        "children": [
                            {
                                "id": "FILE001393804",
                                "text": "Beta software v0.9.3",
                                "type": "file",
                                "icon": "fa fa-file-zip-o fa-lg text-inverse",
                                "state": {
                                    "opened": "false"
                                }
                            }
                        ],
                        "state": {
                            "opened": "false"
                        }
                    },
                    {
                        "id": "FILE001393803",
                        "text": "Product Z program",
                        "type": "file",
                        "icon": "fa fa-file-zip-o fa-lg text-inverse",
                        "state": {
                            "opened": "false"
                        }
                    }
                ],
                "state": {
                    "opened": "false"
                }
            }
        ],
        "state": {
            "opened": "false"
        }
    },
    {
        "id": "2",
        "text": "Product Manuals",
        "type": "folder",
        "Child_Of": "NONE",
        "children": [
            {
                "id": "FILE001984843",
                "text": "Product A Installation Manual",
                "type": "file",
                "icon": "fa fa-file-pdf-o fa-lg text-inverse",
                "state": {
                    "opened": "false"
                }
            },
            {
                "id": "FILE009039742",
                "text": "Product A Commissioning Guide",
                "type": "file",
                "icon": "fa fa-file-pdf-o fa-lg text-inverse",
                "state": {
                    "opened": "false"
                }
            },
            {
                "id": "FILE683579248",
                "text": "Product A User Guide",
                "type": "file",
                "icon": "fa fa-file-pdf-o fa-lg text-inverse",
                "state": {
                    "opened": "false"
                }
            }
        ],
        "state": {
            "opened": "false"
        }
    },
    {
        "id": "3",
        "text": "Manufacturing",
        "type": "folder",
        "Child_Of": "NONE",
        "children": [
            {
                "id": "4",
                "text": "Manufacturing Manuals",
                "type": "folder",
                "Child_Of": "CAT384594",
                "children": [
                    {
                        "id": "FILE2000000001",
                        "text": "Product A Manufacturing Manual",
                        "type": "file",
                        "icon": "fa fa-file-word-o fa-lg text-inverse",
                        "state": {
                            "opened": "false"
                        }
                    }
                ],
                "state": {
                    "opened": "false"
                }
            }
        ],
        "state": {
            "opened": "false"
        }
    },
    {
        "id": "5",
        "text": "Videos",
        "type": "folder",
        "Child_Of": "NONE",
        "children": [
            {
                "id": "6",
                "text": "Product Videos",
                "type": "folder",
                "Child_Of": "CAT394811",
                "children": "NONE",
                "state": {
                    "opened": "false"
                }
            }
        ],
        "state": {
            "opened": "false"
        }
    }
]

這是我的代碼。 可能有更好的方法。 我實際上刪除了您的一個功能,並將其合並到另一個功能中:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" /> 
        <title>
        </title>
        <meta name="generator" content="BBEdit 11.5" /> 
    </head>
    <body>
<?php
$link = mysqli_connect("127.0.0.1", "root", "root", "stackoverflow");

if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}
$sql="SELECT * from Downloads_Categories ORDER BY id";
$result=mysqli_query($link,$sql);
$Download_Categories = mysqli_fetch_all($result,MYSQLI_ASSOC);

$FolderTree = Generate_Tree_Of_Categories($Download_Categories);
usort($FolderTree, function ($item1, $item2) {
    if ($item1['id'] == $item2['id']) return 0;
    return $item1['id'] < $item2['id'] ? -1 : 1;
});

echo "<pre>" . json_encode($FolderTree, JSON_PRETTY_PRINT) . "</pre>";

mysqli_close($link);

function Generate_Tree_Of_Categories(array $elements, $parentId = "NONE")
{
    global $link;
    $branch = array();
    foreach ($elements as $element) {
        if ($element["Child_Of"] == $parentId) {
            $sql="SELECT * from Downloads_Files as DF WHERE '" . $element['Reference'] . "' = DF.Child_Of";
            $result=mysqli_query($link,$sql);
            $Files = mysqli_fetch_all($result,MYSQLI_ASSOC);
            $Child_Nodes = NULL;

            if (count($Files) > 0) {
                 $Child_Nodes = Return_Files($Files); 
            }
            $children = array_merge(Generate_Tree_Of_Categories($elements, $element['Reference']), Return_Files($Files));

            if ($children) {
                $element += ['children' => $children];
            }
            else {
                $element += ['children' => "NONE"];
            }

            $node = Generate_Folder_Node($element["id"],$element["Name"],$element["Child_Of"], $element["children"]);
            $branch[]=$node;
        }   
    }
    return $branch;
}

function Generate_Folder_Node($Element_ID,$Element_Name,$Child_Of, $Child_Nodes) {

    if (!defined('id')) define('id', 'id');
    if (!defined('text')) define('text', 'text');
    if (!defined('type')) define('type', 'type');
    if (!defined('Child_Of')) define('Child_Of', 'Child_Of');
    if (!defined('children')) define('children', 'children');
    if (!defined('state')) define('state', 'state');
    if (!defined('opened')) define('opened', 'opened');
    $Node_Open_Array = array(opened=>"false");
    $Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"folder", Child_Of=>$Child_Of, children=>$Child_Nodes, state=>$Node_Open_Array);
    return $Generated_Node;
}



function Return_Files($Child_Array) {

    $All_Nodes = array();

    foreach ($Child_Array as $Current_Child_Element) {
        $Element_ID   = $Current_Child_Element['Reference'];
        $Element_Name = $Current_Child_Element['Name'];

        if ($Current_Child_Element['Status'] == "AVAILABLE") {
            $DisabledState = "false";
        } else if ($Current_Child_Element['Status'] == "UNAVAILABLE") {
            $DisabledState = "true";
        }

        if ($Current_Child_Element['File_Type'] == "PDF") {
            $Icon = "fa fa-file-pdf-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "ZIP") {
            $Icon = "fa fa-file-zip-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "JPG" || $Current_Child_Element['File_Type'] == "PNG") {
            $Icon = "fa fa-file-picture-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "XLS" || $Current_Child_Element['File_Type'] == "XLSX") {
            $Icon = "fa fa-file-excel-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "DOC" || $Current_Child_Element['File_Type'] == "DOCX") {
            $Icon = "fa fa-file-word-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "PPT" || $Current_Child_Element['File_Type'] == "PPTX") {
            $Icon = "fa fa-file-powerpoint-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "EXE") {
            $Icon = "fa fa-desktop fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "AVI" || $Current_Child_Element['File_Type'] == "MP4") {
            $Icon = "fa fa-file-video-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "MP3" || $Current_Child_Element['File_Type'] == "WAV") {
            $Icon = "fa fa-file-sound-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "TXT") {
            $Icon = "fa fa-file-text-o fa-lg text-inverse";
        } else if ($Current_Child_Element['File_Type'] == "HEX" || $Current_Child_Element['File_Type'] == "BIN") {
            $Icon = "fa fa-file-code-o fa-lg text-inverse";
        } else {
            $Icon = "fa fa-file fa-lg text-inverse";
        }

      $Generated_Node = Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState);

      if (is_array($Generated_Node) == true) {
        if (!empty($Generated_Node)) {
          array_push($All_Nodes, $Generated_Node);
        }
      }
    }
    return $All_Nodes;
}

function Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState) {

    if (!defined('id')) define('id', 'id');
    if (!defined('text')) define('text', 'text');
    if (!defined('type')) define('type', 'type');
    if (!defined('icon')) define('icon', 'icon');
    if (!defined('state')) define('state', 'state');
    if (!defined('opened')) define('opened', 'opened');
    $Node_Open_Array = array(opened=>$DisabledState);

    $Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"file", icon=>$Icon, state=>$Node_Open_Array);

    return $Generated_Node;
}
?>
    </body>
</html>

對於希望使用此解決方案的任何人,下面是JStree初始化說明的鏈接,下面是我用來填充樹的代碼:

初始化: https //www.jstree.com/docs/config/

注意-請務必簽出插件並修改初始化代碼以包括這些插件。 幸運的是,我購買的網站模板帶有JSTree和所有相關插件的自定義主題。

function Generate_Downloads_TreeView() {
    var FunctionToRun = "Request_Download_Tree";
  var http = $.ajax({
    type: "POST",
    url: "controller.php",
    dataType: "json",
    data: {
      FunctionToRun: FunctionToRun
    }

  });
  http.done(function(data, textStatus, jQxhr) {

        $('#jstree-default').jstree({
        "core": {
                    'data': data,


        },
        "types": {
            "default": { "icon": "fa fa-folder text-warning fa-lg" },
            "file": { "icon": "fa fa-file text-warning fa-lg" }
        },
        "plugins": [ "dnd", "state", "types" ]
    });

  });

這是樹的工作方式: 在此處輸入圖片描述

再次感謝您@sscotti!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM