У меня есть многопроцессорный массив, который я хочу преобразовать в модифицированное дерево обхода порядка:
$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; }