В общем рекурсию предпочитаю обходить стороной если не припечет, но тут идеально вместо оверкода, но не понимаю почему не реализуется моя логика. В общем в классе есть два метода, кроме прочих PHP: public function setText($text, $font){ ... if($this->createBlocks(100)){ print "БЛОКИ СОЗДАЛИСЬ\n"; return true; } else { print "Ошибка создания блоков с текстом\n"; return false; } } private function createBlocks($size){ print "КРЕАТЕ БЛОКС ЗАПУЩЕН\n"; if ($this->getBlocksWithText($this->text, $size, $this->drawText) && $this->checkSizeBlocks($size)){ print "КРЕАТЕ БЛОКС ВОЗВРАЩАЕТ ТРУ\n"; return true; } elseif ($size < 35) { print "размер меньше 35\n"; return false; } else { $this->textBlocks = array(); $size = round($size*0.9); print "\n$size\n"; $this->createBlocks($size); } } Выводит в браузер такое: Вот эта функция createBlocks проходит первый раз входит в else вызывает сама себя и в итоге возвращает ТРУ после второго прохода. Но в первом методе так не думаают и конструкция идет в else. Почему? Я чет не понимаю? В общем то все работает, просто TRUE из рекурсии почему-то не засчитывается как TRUE и уходит в ELSE Принты расставлены для проверок
Всего лишь надо было поставить return перед новым вызовом рекурсивной функции. Спасибо за помощь. тему клоз
а я каждый раз когда приходится деревья обходить - туплю)) вроде и не сложно)) но в тоже время сидишь тупишь)
Я где-то на форуме уже выкладывал универсальный обходчик, который напильником под любые нужды точится.. Но сейчас не найду, увы. Так или иначе, он с нуля всегда пишется за две минуты. Ну или просто мне часто приходится с этим сталкиваться..
я за прошедший год пару раз использовал рекурсию)) как то не было нужны в большом количестве деревьев) один раз зимой)) второй раз вот сегодня)) на входе плохоский массив (id, pid, name) надо получить все дочерние элементы у элемента id) PHP: private function calculateChilds($pid, $tree) { static $tmp = array(); foreach($tree as $k=>$v){ if($v['pid'] == $pid){ $tmp[] = $v['id']; unset($tree[$k]); $this->calculateChilds($v['id'], $tree); } } return $tmp; } --- Добавлено --- а вот дерево строю из того же массива)) PHP: private function buildTreeTypes($types, $pid) { $tree = array(); foreach ($types as $k => $t) { if ($t['pid'] == $pid && $k != $t['pid']) { unset($types[$k]); $tree[$k] = array( 'id' => $t['id'], 'pid' => $t['pid'], 'title' => $t['title'], 'icon' => $t['icon'], 'child' => $this->buildTreeTypes($types, $k), ); } } return $tree; } --- Добавлено --- а вот тоже дерево строю но уже li списком PHP: /** * Строим ul li дерево * @param array $tree - дерево типов профиля * @param string $name - name checkbox * @param array $checkeds - массив с установленными галочками * @return string */ public function userTypeTree($tree, $name, $checkeds) { if (is_array($tree)) $string = "<ul>"; foreach ($tree as $v) { $is_checked = in_array($v['id'], $checkeds); $is_pid0 = empty($v['pid']) ? 'class="jstree1_root"' : ''; $string .= "<li {$is_pid0} id=\"type{$v['id']}\">"; $string .= '<label>' . html_checkbox($name . '[' . $v['id'] . ']', $is_checked, $v['id']) . ' <span>' . $v['title'] . '</span></label>'; if (!empty($v['child'])) { $string .= $this->userTypeTree($v['child'], $name, $checkeds); } $string .= "</li>"; } $string .= "</ul>"; return $string; }