Pomocna będzie funkcja do generowania losowych wartości tekstowych:
function randomText(){ $ch = range('a', 'z'); $count = count($ch); $length = rand(5, 10); $text = ''; for($i=0; $i < $length; $i++){ $text .= $ch{rand(0, $count-1)}; } return $text; } |
Utwórzmy klasę Tree, która będzie miała trzy prywatne właściwości określające wygenerowane drzewo, liczbę poziomów drzewa oraz liczbę gałęzi na każdym poziomie.
Do metody Tree::makeTree() przekazujemy wartości, które określą nam wielkość drzewa.
W końcu generujemy rekurencyjnie drzewo w prywatnej metodzie Tree::_makeTree(). Wartości przekazywane do tej metody to aktualny poziom, numer gałęzi na poziomie oraz numer węzła w drzewie, tzn. klucz w tablicy rodzica.
class Tree{ private $tree; // wygenerowane drzewo private $levels; // liczba poziomów drzewa private $branches; // liczba gałęzi na każdym poziomie public function makeTree($levels, $branches){ $this->tree = array(); $this->levels = $levels; $this->branches = $branches; $this->_makeTree(); } private function _makeTree($level = 0, $branch = 0, $id = null){ if ($level > $this->levels) { return; } $this->tree[] = array('value' => randomText(), 'parent' => $id); end($this->tree); $id = key($this->tree); for($i=0; $i < $this->branches; $i++) { $this->_makeTree($level+1, $i, $id); } } public function getTree(){ return $this->tree; } } |
Aby wartości w drzewie miały za każdym razem takie same wartości, można ustawić generator liczb losowych.
srand(0); $t = new Tree(); $t->makeTree(3,2); var_dump($t->getTree()); |
Te ustawienia wygenerują tablicę o tej strukturze:
array 0 => array 'value' => string 'eifefuq' (length=7) 'parent' => null 1 => array 'value' => string 'yknjklv' (length=7) 'parent' => int 0 2 => array 'value' => string 'fovima' (length=6) 'parent' => int 1 3 => array 'value' => string 'rtnuteg' (length=7) 'parent' => int 2 4 => array 'value' => string 'miagkiylls' (length=10) 'parent' => int 2 5 => array 'value' => string 'xbpvmgosn' (length=9) 'parent' => int 1 6 => array 'value' => string 'tqwrsjw' (length=7) 'parent' => int 5 7 => array 'value' => string 'ocjmxpr' (length=7) 'parent' => int 5 8 => array 'value' => string 'uarkvdrq' (length=8) 'parent' => int 0 9 => array 'value' => string 'coehs' (length=5) 'parent' => int 8 10 => array 'value' => string 'nkdupaci' (length=8) 'parent' => int 9 11 => array 'value' => string 'hvcjublmpy' (length=10) 'parent' => int 9 12 => array 'value' => string 'gihucb' (length=6) 'parent' => int 8 13 => array 'value' => string 'zzkpck' (length=6) 'parent' => int 12 14 => array 'value' => string 'nbjtsdg' (length=7) 'parent' => int 12 |