@zap_temp

Кто предоставит помощь в написании циклом рекурсивного алгоритма построения дерева масива?

Ребята, помогите пожалуйста. Хочу построить такой массив:
array(
    'id_1'  => array(
        'main'  =>  array('arg1', 'arg2'),
        'sub'  =>  array(),
    ),
    'id_2'  => array(
        'main'  =>  array('arg1', 'arg2'),
        'sub'  =>  array(
            'id_3'  => array(
                'main'  =>  array(),
                'sub'  =>  array(
                    'id_4'  => array(
                        'main'  =>  array(),
                        'sub'  =>  array(
                            'id_5'  => array(
                                'main'  =>  array('arg1', 'arg2'),
                                'sub'  =>  array(),
                        ),
                    ),
                    ),
                ),
            ),
        ),
    ),
)

У меня есть функция которая принимает 4 аргумента, вот ее вызов:
$test->add('id_1','arg1','arg2');
$test->add('id_2','arg1','arg2');
$test->add('id_5','arg1','arg2', array('id_2','id_3','id_4'));

Это означает:
Запиши в array['id_1' ]['main'] = array('arg1', 'arg2')
Запиши в array['id_2' ]['main'] = array('arg1', 'arg2')
Запиши в array['id_2' ]['sub']['id_3' ]['sub']['id_4' ]['sub']['id_5']['main'] = array('arg1', 'arg2');


Реализовал я так:
protected static $elements = array();
public function add($id, $arg1, $arg2, array $parents = NULL){
        self::_add($id, $arg1, $arg2, $parents, self::$elements);
}
protected function _add(&$id, &$arg1, &$arg2, $parents, array &$storage,){
        if($parents === NULL){
            $storage[$id] = array(
                'main'  => array($arg1, $arg2),
                'sub'   => array(),
            );
        }else{
            $i = 0;
            $d = &$storage;
            foreach($parents as $child_of){
                if($i === count($parents) - 1){
                    $d['sub'][$id] = array($arg1, $arg2);
                }else{
                    if(!isset($d[$child_of]['sub'][$parents[$i+1]])){
                        $d[$child_of]['sub'][$parents[$i+1]] = array();
                    }
                    $d = &$d[$child_of]['sub'][$parents[$i+1]];
                }
                $i++;
            }
        }

    }

f53e14e363c240079b19794b416cb7e4.png
По результату видно что где-то ошибся, кто подскажет где? Спасибо!
П.С. Не предлагать рекурсию, хотя согласен что на ней задача решалась бы проще. Но увы - прошу помощи только в цикле. Спасибо
  • Вопрос задан
  • 2255 просмотров
Пригласить эксперта
Ответы на вопрос 1
class StaticElementContainer {
  protected static $_elements = array();

  public static function getElements() {
    return self::$_elements;
  }

  public function addElement($id, $arg1, $arg2, $parents = array()) {
    if (empty($parents)) {
      self::$_elements[$id] = self::_prepareElement(array($arg1, $arg2));
    }
    else {
      $_elements = &self::$_elements;
      while ($parents) {
        $parent = array_shift($parents);
        if (!isset($_elements[$parent])) {
          $_elements[$parent] = self::_prepareElement();
        }

        $_elements = &$_elements[$parent]['sub'];
      }

      $_elements[$id] = self::_prepareElement(array($arg1, $arg2));
    }
  }

  protected static function _prepareElement($main = array(), $sub = array()) {
    return array(
      'main' => $main,
      'sub' => $sub,
    );
  }
}

$test = new StaticElementContainer();
$test->addElement('id_1','arg1','arg2');
$test->addElement('id_2','arg1','arg2');
$test->addElement('id_5','arg1','arg2', array('id_2','id_3','id_4'));

print_r(StaticElementContainer::getElements());


выводит:
Array
(
    [id_1] => Array
        (
            [main] => Array
                (
                    [0] => arg1
                    [1] => arg2
                )

            [sub] => Array
                (
                )

        )

    [id_2] => Array
        (
            [main] => Array
                (
                    [0] => arg1
                    [1] => arg2
                )

            [sub] => Array
                (
                    [id_3] => Array
                        (
                            [main] => Array
                                (
                                )

                            [sub] => Array
                                (
                                    [id_4] => Array
                                        (
                                            [main] => Array
                                                (
                                                )

                                            [sub] => Array
                                                (
                                                    [id_5] => Array
                                                        (
                                                            [main] => Array
                                                                (
                                                                    [0] => arg1
                                                                    [1] => arg2
                                                                )

                                                            [sub] => Array
                                                                (
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)


избегайте называть переменные одной буквой
и делать функции которые принимают больше 2 параметров
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы