PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
megavolt217
Отправлено: 16 Марта, 2015 - 11:38:53
Новичок
Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2015
Помог: 0 раз(а)
Помогите пожалуйста сделать функцию дерева категорий есть код с использованием New PDO А как мне сделать это же с использованием MYSQLI
Вот пример:
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
/**
* PHP5 (ООП)
* Постоение дерева (меню неограниченной вложености)
* @author дизайн студия ox2.ru
*/
class TreeOX2 {
private $_db = null ;
private $_category_arr = array ( ) ;
public function __construct( ) {
//Подключаемся к базе данных, и записываем подключение в переменную _db
$this -> _db = new PDO( "mysql:dbname=ox2.ru-test-base;host=localhost" , "root" , "" ) ;
//В переменную $_category_arr записываем все категории (см. ниже)
$this -> _category_arr = $this -> _getCategory( ) ;
}
/**
* Метод читает из таблицы category все сточки, и
* возвращает двумерный массив, в котором первый ключ - id - родителя
* категории (parent_id)
* @return Array
*/
private function _getCategory( ) {
$query = $this -> _db-> prepare ( "SELECT * FROM `category`" ) ; //Готовим запрос
$query -> execute ( ) ; //Выполняем запрос
//Читаем все строчки и записываем в переменную $result
$result = $query -> fetchAll ( PDO:: FETCH_OBJ ) ;
//Перелапачиваем массим (делаем из одномерного массива - двумерный, в котором
//первый ключ - parent_id)
foreach ( $result as $value ) { //Обходим массив
$return [ $value -> parent_id ] [ ] = $value ;
}
return $return ;
}
/**
* Вывод дерева
* @param Integer $parent_id - id-родителя
* @param Integer $level - уровень вложености
*/
public function outTree( $parent_id , $level ) {
if ( isset ( $this -> _category_arr[ $parent_id ] ) ) { //Если категория с таким parent_id существует foreach ( $this -> _category_arr[ $parent_id ] as $value ) { //Обходим ее
/**
* Выводим категорию
* $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
*/
echo "<div style='margin-left:" . ( $level * 25 ) . "px;'>" . $value -> name . "</div>" ;
$level ++; //Увеличиваем уровень вложености
//Рекурсивно вызываем этот же метод, но с новым $parent_id и $level
$this -> outTree ( $value -> id , $level ) ;
$level --; //Уменьшаем уровень вложености
}
}
}
}
$tree = new TreeOX2( ) ;
$tree -> outTree ( 0, 0) ; //Выводим дерево
?>
(Отредактировано автором: 16 Марта, 2015 - 11:39:40)
herecar
Отправлено: 17 Марта, 2015 - 10:04:11
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Янв. 2015
Помог: 0 раз(а)
Ну разберешся)
PHP:
скопировать код в буфер обмена
<?
class Tree {
private $data ;
public function __construct( ) {
'id' => 1 ,
'parent_id' => 0 ,
'name' => 'item 1'
) ,
'id' => 2 ,
'parent_id' => 1 ,
'name' => 'item 2'
) ,
'id' => 3 ,
'parent_id' => 1 ,
'name' => 'item 3'
) ,
'id' => 4 ,
'parent_id' => 0 ,
'name' => 'item 4'
) ,
'id' => 5 ,
'parent_id' => 4 ,
'name' => 'item 5'
) ,
'id' => 6 ,
'parent_id' => 5 ,
'name' => 'item 6'
) ,
'id' => 7 ,
'parent_id' => 5 ,
'name' => 'item 7'
)
) ;
$this -> data = $data ;
}
public function outTree( ) {
$data = $this -> getHierarchy ( $this -> data ) ;
$this -> hierarchyOut ( $data , 0) ;
}
private function getHierarchy( $data ) {
for ( $i = 0
, $c = count ( $data ) ; $i < $c ; $i ++ ) { $new_arr [ $data [ $i ] [ 'parent_id' ] ] [ ] = $data [ $i ] ;
}
return $new_arr ;
}
private function hierarchyOut( $data , $parent = 0, $level = 0) {
$arr = $data [ $parent ] ;
for ( $i = 0 ; $i < count ( $arr ) ; $i ++ ) {
?> <div style="margin-left: <?PHP echo ( $level * 25) ; ?> px">
<?PHP echo $arr [ $i ] [ 'name' ] ; ?> </div><?PHP
$level ++;
if ( isset ( $data [ $arr [ $i ] [ 'id' ] ] ) ) { $this -> hierarchyOut ( $data , $arr [ $i ] [ 'id' ] , $level ) ;
}
$level --;
}
}
}
$a = new Tree( ) ;
$a -> outTree ( ) ;
?>
(Отредактировано автором: 17 Марта, 2015 - 10:05:17)
megavolt217
Отправлено: 17 Марта, 2015 - 13:31:34
Новичок
Покинул форум
Сообщений всего: 2
Дата рег-ции: Март 2015
Помог: 0 раз(а)
herecar, Спасибо большое разобрался подделал все хорошо работает!
(Добавление)
Вот так у меня теперь работает
CODE (
htmlphp ):
скопировать код в буфер обмена
class Tree {
private $data;
public function __construct($mestopokaza) {
global $mysqli;
global $prefix;
$query = $mysqli->query("SELECT * FROM `".$prefix."link` WHERE `mest` = '".$mestopokaza."' ORDER BY `position`"); //Готовим запрос
while($row = $query->fetch_assoc())
{
$data[] = $row;
}
$this->data = $data;
}
public function outTree() {
$data = $this->getHierarchy($this->data);
$this->hierarchyOut($data, 0);
}
private function getHierarchy($data) {
$new_arr = array();
for ($i = 0, $c = count($data); $i < $c ; $i ++ ) {
$new_arr [ $data [ $i ] [ 'uid' ] ] [ ] = $data [ $i ] ;
}
return $new_arr ;
}
private function hierarchyOut( $data , $parent = 0, $level = 0) {
$arr = $data [ $parent ] ;
echo '<ul class="vyp-menu"> ';
for($i = 0; $i
< count ( $arr ) ; $i ++ ) {
echo "<li><a href=''> " . $arr[$i]['name'] . "</ a> ";
$level++;
if(isset($data[$arr[$i]['id']])) {
$this->hierarchyOut($data, $arr[$i]['id'], $level);
}
echo'</ li> ';
$level--;
}
echo'</ ul> ';
}
}
$lin = new Tree(2);
$lin->outTree();
Как это сделать что бы это не вызывалось в том месте где вставленно а занести в переменную и выводить из нее
$lin = new Tree(2);
$per = $lin->outTree();
это тоже отображается где она вписана, а не где я вставляю переменную $per
herecar
Отправлено: 17 Марта, 2015 - 15:26:53
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Янв. 2015
Помог: 0 раз(а)
Замени:
PHP:
скопировать код в буфер обмена
<?
private function hierarchyOut( $data , $parent = 0, $level = 0) {
$arr = $data [ $parent ] ;
$this -> outData .= '<ul>' ;
for ( $i = 0 ; $i < count ( $arr ) ; $i ++ ) {
$this -> outData .= '<li><a href="">' . $arr [ $i ] [ 'name' ] . '</a></li>' ;
if ( isset ( $data [ $arr [ $i ] [ 'id' ] ] ) ) { $this -> hierarchyOut ( $data , $arr [ $i ] [ 'id' ] , $level ) ;
}
}
$this -> outData .= '</ul>' ;
}
?>
и
PHP:
скопировать код в буфер обмена
<?
public function outTree( ) {
$data = $this -> getHierarchy ( $this -> data ) ;
$this -> hierarchyOut ( $data , 0) ;
return $this -> outData ;
}
?>
и добавь поле private $outData = "";
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB