PHP 将多维数组转换为修改后的前序遍历树 [英] PHP converting multidimensional array to Modified Pre-order Traversal Tree

查看:45
本文介绍了PHP 将多维数组转换为修改后的前序遍历树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个多维数组,我想将其转换为修改后的预排序遍历树:

I have a multidimendional array that I want to transform to a Modified Pre-order Traversal Tree:

$data = array(
    "MTGO" => array("Magic Online" => array("MTGO Masters Edition", "MTGO Masters Edition II", "MTGO Masters Edition III", "MTGO Masters Edition IV")),
    "Expansions" => array("Ice Age Cycle" => array("Coldsnap Theme Decks", "Ice Age", "Alliances"), "Theros" => array("Theros")),
    "unclassified" => array("Portal", "Eight Edition")
);

我尝试通过循环嵌套数组或使用迭代器,但我只是没有成功获得正确的界限.

I've tried by looping through the nested arrays, or using iterators, but I just didn't succeeded in getting the right bound.

这里我有什么左边界,我如何得到正确的??

Here what I have for getting left bound, how do I get the right one ??

foreach ($data as $groupname => $group) {
    echo $i.':'.$groupname . '<br/>';
    if (is_array($group)) {
        foreach ($group as $blockname => $block) {
            $i++;
            if (is_array($block)) {
                echo "&nbsp;&nbsp;&nbsp;" .$i.':'. $blockname . '<br/>';
                foreach ($block as $setname) {
                    $i++;
                    echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" .$i.':'. $setname . '<br/>';
                }
            } else {
                echo "&nbsp;&nbsp;&nbsp;" .$i.':'. $block . '<br/>';
            }
        }
    }
    $i++;
}

推荐答案

最后我找到了一个解决方案,满足我的需求,所以它深入 3 级,但它可以通过一些调整轻松适应递归需求:

Finally I've found a solution, for my needs so it goes 3 level deep, but it can be easily adapted to recursive needs with some tweaks:

class Mptt_object {
    public $lb;
    public $rb;
    public $data;
    public function __construct($name, $lb, $rb = null) {
        $this->data = $name;
        $this->lb = $lb;
        $this->rb = $rb;
    }
}


function getMptt(array $data)
{
    /** @var Mptt_object[] $mptts */
    $mptts = array();

    $i = 0;
    foreach ($data as $firstLevelElementKey => $firstLevelElement) {

        $i++;

        $firstLevelElementMptt = new Mptt_object($firstLevelElementKey, $i);

        foreach ($firstLevelElement as $secondLevelElementKey => $secondLevelElement) {
            if (is_array($secondLevelElement)) {

                $i++;
                $secondLevelElementMptt = new Mptt_object($secondLevelElementKey, $i);

                $thirdLevelElementMptts = array();
                foreach ($secondLevelElement as $thirdLevelElementKey => $thirdLevelElement) {
                    $i++;
                    $thirdLevelElementMptt = new Mptt_object($thirdLevelElement, $i);
                    $i++;
                    $thirdLevelElementMptt->rb = $i;
                    $mptts[] = $thirdLevelElementMptt;
                }
                $i++;
                $secondLevelElementMptt->rb = $i;
                $mptts[] = $secondLevelElementMptt;
                $mptts = array_merge($mptts, $thirdLevelElementMptts);
            } else {
                $i++;
                $secondLevelElementMptt = new Mptt_object($secondLevelElement, $i);
                $i++;
                $secondLevelElementMptt->rb = $i;
                $mptts[] = $secondLevelElementMptt;
            }
        }
        $i++;
        $firstLevelElementMptt->rb = $i;
        $mptts[] = $firstLevelElementMptt;
    }
    return $mptts;
}

这篇关于PHP 将多维数组转换为修改后的前序遍历树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆