Поэтому я прочитал это: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
И я использую mysql и php. Мне нужен скрипт, который конвертирует только один раз старые данные в данные с левыми / правыми значениями.
Мне не нужно добавлять / обновлять вещи.
Данные php
$in_array = array ( array( 'id' => 400, 'n' => 'Sub 1a', 's' => array ( array ( 'n' => 'Sub 1b', 'id' => 421, 's' => array ( array ( 'n' => 'Sub 1c', 'id' => 422, ) ) ) ) ), array( 'id' => 500, 'n' => 'Sub 2a', 's' => array ( array ( 'n' => 'Sub 2b', 'id' => 521, 's' => array ( array ( 'n' => 'Sub 3b', 'id' => 522, ) ) ) ) ) );
На данный момент я пытаюсь решить это с помощью этого скрипта, но это не работает так, как должно.
$a_newTree = array(); function rebuild_tree($parent, $left) { global $a_newTree; $indexed = array(); // the right value of this node is the left value + 1 $right = $left+1; // get all children of this node foreach($parent as $cat){ // recursive execution of this function for each // child of this node // $right is the current right value, which is // incremented by the rebuild_tree function if(is_array($cat) && array_key_exists('s',$cat)){ $indexed['n'] = $cat['n']; $right = rebuild_tree($cat, $right); } } // we've got the left value, and now that we've processed // the children of this node we also know the right value array_push($a_newTree,array(':lft'=>$left,':rgt'=>$right,':name'=>'bla')); // return the right value of this node + 1 return $right+1; } rebuild_tree($in_array, 1);
Я могу получить доступ к mysql и запросить, чтобы результат был таким
Sub 1a | Sub 1b | Sub 1c Sub 1a | Sub 1b | Sub 1d Sub 1a | Sub 1b | Sub 1e Sub 1a | Sub 1f | Null Sub 1a | Sub 1g | Null Sub 2a | Sub 2b | Sub 2c
С этими данными я сделал массив выше.
Массив не был окером.
Это работает
$in_array = array ( // array( 'id' => 400, 'n' => 'Sub 1a', 's' => array ( // array ( 'n' => 'Sub 1b', 'id' => 421, 's' => array ( // array ( 'n' => 'Sub 1c', 'id' => 422, // ) ) // ) // ) ), array( 'id' => 500, 'n' => 'Sub 2a', 's' => array ( // array ( 'n' => 'Sub 2b', 'id' => 521, 's' => array ( // array ( 'n' => 'Sub 3b', 'id' => 522, // ) ) // ) ) ) ); $a_newTree = array(); function rebuild_tree($parent, $left) { global $a_newTree; $indexed = array(); $right = $left+1; if(array_key_exists('n',$parent)){ $indexed['n'] = $parent['n']; }else{ $indexed['n'] = '?'; } foreach($parent as $cat){ if(is_array($cat)){ $right = rebuild_tree($cat, $right); } } array_push($a_newTree,array(':lft'=>$left,':rgt'=>$right,':name'=>$indexed['n'])); return $right+1; } rebuild_tree($in_array, 1);