PHP将多维数组转换为修改的预序遍历树
我有一个多维数组,我想把它转换成一个修改过的预序遍历树:PHP将多维数组转换为修改的预序遍历树,php,multidimensional-array,mptt,Php,Multidimensional Array,Mptt,我有一个多维数组,我想把它转换成一个修改过的预序遍历树: $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" =&g
$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")
);
我尝试过通过嵌套数组循环,或者使用迭代器,但是没有成功地得到正确的边界
这里是我的左边界,我如何得到正确的
foreach ($data as $groupname => $group) {
echo $i.':'.$groupname . '<br/>';
if (is_array($group)) {
foreach ($group as $blockname => $block) {
$i++;
if (is_array($block)) {
echo " " .$i.':'. $blockname . '<br/>';
foreach ($block as $setname) {
$i++;
echo " " .$i.':'. $setname . '<br/>';
}
} else {
echo " " .$i.':'. $block . '<br/>';
}
}
}
$i++;
}
最后,我找到了一个解决方案,可以满足我的需求,因此它可以深入到3个级别,但可以通过一些调整轻松地适应递归需求:
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;
}