【问题标题】:PHP treeview from database array来自数据库数组的 PHP 树视图
【发布时间】:2018-03-08 23:18:37
【问题描述】:

我有来自数据库查询的以下数组。
我想创建一个树视图,其中父级为“win_name”,子级为“item_name”。在过去的几天里,我尝试了 foreach 和 while 循环、本论坛中的其他答案、在线教程、jquery 插件和 jstree 的组合。我似乎无法让它发挥作用

父级=“win_name”
--child = "item_name"

array(857) {
     [0]=>
     object(stdClass)#11 (5) {
       ["item_name"]=>
       string(6) "$rocks"
       ["item_id"]=>
       string(4) "3045"
       ["win_name"]=>
       string(12) "Tequila Mods"
       ["win_id"]=>
       string(1) "3"
       ["sales_mode"]=>
       string(1) "1"
     }
     [1]=>
     object(stdClass)#24 (5) {
       ["item_name"]=>
       string(13) "Queso Fundido"
       ["item_id"]=>
       string(4) "1101"
       ["win_name"]=>
       string(6) "Snacks"
       ["win_id"]=>
       string(2) "29"
       ["sales_mode"]=>
       string(1) "1"
     }
     [2]=>
     object(stdClass)#25 (5) {
       ["item_name"]=>
       string(9) "Texaz Dip"
       ["item_id"]=>
       string(4) "1102"
       ["win_name"]=>
       string(6) "Snacks"
       ["win_id"]=>
       string(2) "29"
       ["sales_mode"]=>
       string(1) "1"
     }
     [3]=>
     object(stdClass)#26 (5) {
       ["item_name"]=>
       string(10) "Summer Sea"
       ["item_id"]=>
       string(4) "1481"
       ["win_name"]=>
       string(6) "Snacks"
       ["win_id"]=>
       string(2) "29"
       ["sales_mode"]=>
       string(1) "1"
     }

【问题讨论】:

标签: php mysql arrays treeview


【解决方案1】:
<?php

class treeView
{
    public $treeview = array();

    // In the construct, we transform your current array to an array that we can use
    function __construct($main)
    {
        $main = (array) $main;

        foreach($main as $view)
        {
            // We add the parent ONLY if we don't already have it
            $this->treeview['parent'][$view['win_name']]['win_name'] = $view['win_name'];
            $this->treeview['parent'][$view['win_name']]['win_id'] = $view['win_id'];
            $this->treeview['parent'][$view['win_name']]['sales_mode'] = $view['sales_mode'];

            // Adding all of the childs
            $this->treeview['child'][$view['win_name']][$view['item_id']]['item_name'] = $view['item_name'];
            $this->treeview['child'][$view['win_name']][$view['item_id']]['item_id'] = $view['item_id'];
        }
    }

    public function buildTree()
    {
        // Looping through each parent and outputting it's content and it's children
        foreach($this->treeview['parent'] as $branch)
        {
            if(isset($this->treeview['child'][$branch['win_name']]))
            {
                echo "<ol>";
                echo "<li>Win Name: {$branch['win_name']}</li>";
                echo "<li>Win ID: {$branch['win_id']}</li>";
                echo "<li>Sales Mode: {$branch['sales_mode']}</li>";
                $this->buildChild($branch['win_name']);         // Our call which builds the children
                echo "</ol>";
            }
            else
            {
                echo "<ol>";
                echo "<li>Win Name: {$branch['win_name']}</li>";
                echo "<li>Win ID: {$branch['win_id']}</li>";
                echo "<li>Sales Mode: {$branch['sales_mode']}</li>";
                echo "</ol>";
            }
        }
    }

    private function buildChild($parent)
    {
        // Looping through each child... technically we could make this recursive and allow children to have children
        foreach($this->treeview['child'][$parent] as $child)
        {
            echo "<li style=\"list-style-type: none;\">";
            echo "<ol>";
            echo "<li>Item Name: {$child['item_name']}</li>";
            echo "<li>Item ID: {$child['item_id']}</li>";
            echo "</ol>";
            echo "</li>";
        }
    }
}

$array = array (
    array (
        'item_name' => "\$rocks",
        'item_id' => "3045",
        'win_name' => "Tequila Mods",
        'win_id' => "3",
        'sales_mode' => "1",
    ),
    array (
        'item_name' => "Queso Fundido",
        'item_id' => "1101",
        'win_name' => "Snacks",
        'win_id' => "29",
        'sales_mode' => "1",
    ),
    array (
        'item_name' => "Texaz Dip",
        'item_id' => "1102",
        'win_name' => "Snacks",
        'win_id' => "29",
        'sales_mode' => "1",
    ),
    array (
        'item_name' => "Summer Sea",
        'item_id' => "1481",
        'win_name' => "Snacks",
        'win_id' => "29",
        'sales_mode' => "1",
    )
);

// Initiating our class
$tree = new treeView($array);

// Building our tree
$tree->buildTree();

?>

这将生成以下列表

&lt;ol&gt;&lt;li&gt;Win Name: Tequila Mods&lt;/li&gt;&lt;li&gt;Win ID: 3&lt;/li&gt;&lt;li&gt;Sales Mode: 1&lt;/li&gt;&lt;li style="list-style-type: none;"&gt;&lt;ol&gt;&lt;li&gt;Item Name: $rocks&lt;/li&gt;&lt;li&gt;Item ID: 3045&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;li&gt;Win Name: Snacks&lt;/li&gt;&lt;li&gt;Win ID: 29&lt;/li&gt;&lt;li&gt;Sales Mode: 1&lt;/li&gt;&lt;li style="list-style-type: none;"&gt;&lt;ol&gt;&lt;li&gt;Item Name: Queso Fundido&lt;/li&gt;&lt;li&gt;Item ID: 1101&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li style="list-style-type: none;"&gt;&lt;ol&gt;&lt;li&gt;Item Name: Texaz Dip&lt;/li&gt;&lt;li&gt;Item ID: 1102&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li style="list-style-type: none;"&gt;&lt;ol&gt;&lt;li&gt;Item Name: Summer Sea&lt;/li&gt;&lt;li&gt;Item ID: 1481&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;

说实话,这是非常肮脏和丑陋的。我制作了这段代码来处理你的数组,但这不是最好的方法。更好的方法是使用 PDO,并使用 FETCH_GROUP 按win_name (the parent) 分组,然后通过这种方式获得所需的数组。

学习Veerendra's solution 'Thank you ficuscr' 也不错,并可能尝试根据您的要求实施类似的系统。

【讨论】:

  • 这太棒了!取得了成果,并在此过程中学到了很多东西!我目前也在处理 PDO FETCH_GROUP 建议。
猜你喜欢
  • 1970-01-01
  • 2020-01-19
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多