У меня есть БД:
id text parent 1 Parent 1 0 2 Child of 1 1 3 Sibling 1 4 Another Parent 0 5 A first child 4
Поэтому я пытаюсь захватить древовидную структуру, в которой перечислены родители. Я знаю другой вариант (вложенные наборы, на мой взгляд?), Но сейчас я буду придерживаться этого. Теперь я пытаюсь получить данные из БД и в структуру вложенных массивов в PHP. У меня есть такая функция:
class Data_Manager { public $connection = ''; public $collection = array(); function __construct() { $this->connection = mysql_connect('localhost', 'root', 'root'); $thisTable = mysql_select_db('data'); // error handling truncated } function get_all() { $arr = &$this->collection; $this->recurseTree('', 0, $arr); var_dump($arr); } function recurseTree($parent, $level, $arrayNode) { $result = mysql_query('SELECT * FROM tasks WHERE parent="' . $parent . '";'); while ($row = mysql_fetch_array($result)) { $row['children'] = array(); //where I'd like to put the kids $arrayNode[$row['id']]= $row; $this->recurseTree($row['id'], $level+1, $arrayNode[$row['id']]); } } }
Так что я хотел бы выступить с каким-то вложенным деревом ассоциативных массивов, но я не могу понять, как это сделать. Кажется, что ничто не пишет в массив, в который я вхожу, и я как бы проигрываю себя в рекурсии. Может кто-нибудь помочь мне получить этот последний горб, который приведет к чему-то вроде:
[ Parent1 => [ children => ['Child of 1', 'Sibling'] ], AnotherParent => [ children => ['First Child'] ] ]
И меня меньше интересует конкретная форма вывода. Он будет превращен в JSON, и я еще не занимался написанием обработчика на стороне клиента, поэтому не беспокойтесь о точной структуре.
Благодаря!
Попробуй это.
$sql = "SELECT * FROM tasks"; $r = mysql_query($sql, $conn); $arr = array(); while ($row = mysql_fetch_assoc($r)) $arr[] = $row function build($arrayIn, $parent) { $makeFilter = function($p) {return function($x) use ($p) {return $x['parent'] == $p;};}; $f = $makeFilter($parent); $these = array_filter($arrayIn, $f); $remaining = array_diff_assoc($arrayIn, $these); $ans = array(); foreach($these as $cur) { $ans[$cur['text']] = build($remaining, $cur['id']); } return $ans ? $ans : null; } $tree = build($arr, 0) echo_r($arr); echo "becomes<br />"; echo_r($tree);
Вот мой вывод:
Array ( [0] => Array ( [text] => a [id] => 1 [parent] => 0 ) [1] => Array ( [text] => b [id] => 2 [parent] => 0 ) [2] => Array ( [text] => c [id] => 3 [parent] => 1 ) [3] => Array ( [text] => d [id] => 4 [parent] => 2 ) [4] => Array ( [text] => e [id] => 5 [parent] => 2 ) [5] => Array ( [text] => f [id] => 6 [parent] => 3 ) ) becomes Array ( [a] => Array ( [c] => Array ( [f] => ) ) [b] => Array ( [d] => [e] => ) )
Этот бит псевдокода должен помочь.
функция getTasks ($ parent = 0) { $ tasks = array (); $ query = mysql_query («выберите * из таблицы, где parent = $ parent»); $ rows = array (); while (($ row = mysql_fetch_assoc ($ query))! == FALSE) {$ rows [] = $ row; } если (COUNT ($ строк)) { $ tasks [$ parent] [] = getTasks ($ parent); } else { return $ tasks; } } $ tasks = getTasks ();
Здесь вам не нужна рекурсивная функция. Получите все данные, используя один запрос к базе данных и зациклив на него. Это будет намного быстрее, чем несколько запросов к базе данных.
Предполагая, что вы храните данные в MySQL, см. Ответ на этот вопрос для инструкций о том, как написать инструкцию SELECT в таблице List Adjacency, которая возвращает все в иерархии . Короче говоря, используйте переменные сеанса MySQL. Затем возьмите набор результатов и зациклитесь на нем, используйте стек, чтобы нажать – поп – загляните в последний идентификатор родителя, чтобы определить отступ ваших структур данных.
Вот класс PHP, который я написал для обработки всех видов задач списка Adjacency.
http://www.pdvictor.com/?sv=&category=just+code&title=adjacency+model