PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (13): « 1 2 3 4 [5] 6 7 8 9 ... » В конец
Найдено сообщений: 186
Kubert
Отправлено: 25 Августа, 2011 - 10:03:55 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка
Ответов: 49 Просмотров: 9866
egir
Вот так достану:
CODE (
htmlphp ):
скопировать код в буфер обмена
$result = mysql_query ( "SELECT id,pid,name,idObject FROM category ORDER BY sort,id" ) ; $cats [ $cat [ 'pid' ] ] [ ] = $cat ;
$listCat [ $cat [ 'id' ] ] [ 'id' ] = $cat [ 'id' ] ;
$listCat [ $cat [ 'id' ] ] [ 'pid' ] = $cat [ 'pid' ] ;
$listCat [ $cat [ 'id' ] ] [ 'idObject' ] = $cat [ 'idObject' ] ;
$listCat [ $cat [ 'id' ] ] [ 'name' ] = $cat [ 'name' ] ;
}
}
И выведу:
CODE (
htmlphp ):
скопировать код в буфер обмена
function listTree($cats,$parent_id){
if(is_array($cats) and isset($cats[$parent_id])){
$tree = '< ul> ';
foreach($cats[$parent_id] as $cat){
$tree .= '< li> '.$cat['name'];
$tree .= listTree($cats,$cat['id']);
$tree .= '</ li> ';
}
$tree.= '</ ul> ';
}
else return null;
return $tree;
}
//echo listTree($cats,0);
DeepVarvar
Функция эта у меня есть(выше написал)! Но спасибо, Вам!
Но затея как раз и состояла в том чтобы в ссылке link прописывать полный путь потомков.
типа:
href="/?idObject1=111&idObject2=222&idObject3=333&idObject4=444"
где 444 активный пункт меню.
+ это поможет мне составить "строку навигации".
А может быть вообще гоню и такие вложенности делают по другому?!
egir
Добавлю WHERE так как у меня в одной таблице категорий лежат все категории для 300 сайтов. а в каждом сайте примерно от 5 до 50 пунктов.
Но я уже подумывал делать сохранять полный путь всех потомков в БД...
Вот теперь и незнаю что делать)
Но если я буду прописывать в БД полный путь потомков, типа "111,222,333,444",
мне все равно придется при добавлении или обновлении страницы, необходимо будет запускать эту злосчастную функцию
А касательно большого кол-во запросов. Уж не хотелось бы этого делать, так как для этого все и замутилось. В данный момент на сайтах стоят как раз такие "обработчики" которые в цикле обращаются постоянно к БД.
Парни помогите, я уже замучился!
Kubert
Отправлено: 24 Августа, 2011 - 17:17:50 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка
Ответов: 49 Просмотров: 9866
Champion
Не понимаю...
Мог бы ты привести код для данного примера.
Я же перед тем как вызвать внутренний find() присваиваю значение массиву...
А потом при запуске find() передаю его дальше и так пока функция не дойдет до конца.
Т.е. массив постоянно новый должен передаваться в функцию...
А когда функция закончина, то уже полностью сформированный массив передаю "ретурном".
Разве не так?
Kubert
Отправлено: 24 Августа, 2011 - 15:24:15 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка
Ответов: 49 Просмотров: 9866
Мелкий
Что же она вернула и как я игнорирую это... Можете пояснить?
DeepVarvar
Мне из предыдущей функции(ее здесь нет), известен только id который я передаю в этой функции. А эта функция мне как раз помогает найти всех предков этого id...
Я явно запутался
Kubert
Отправлено: 24 Августа, 2011 - 14:31:52 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка
Ответов: 49 Просмотров: 9866
Мелкий
Как же?
Я ищу в многомерном массиве $fintParent его родителя и добавляю в массив $listId значение $idObject
вот вроде: $listId[] = $fintParent[$id]['pid'];
Разве нет? А потом снова вызываю эту функцию но с уже id родителя и так до бесконечности пока родитель не будет равен "0"
Kubert
Отправлено: 24 Августа, 2011 - 14:16:57 • Тема: Рекурсивная функция • Форум: Хранение данных, их вывод и обработка
Ответов: 49 Просмотров: 9866
Функция должна искать своих "предков" до корневого(т.е. со значение родителя равного "0"), записывать в массив их idObject...
Примерно картина из БД такая:
CODE (
htmlphp ):
скопировать код в буфер обмена
id | pid | name | idObject
1 | 0 | Категория 1 | 111
...
3 | 1 | Категория 1. 1 | 222
...
10 | 3 | Категория 1. 1. 1 | 333
...
45 | 10 | Категория 1. 1. 1. 1 | 444
...
Функция должна выводить примерно такое:
Массив $fintParent такого вида:
Сама функция
CODE (
htmlphp ):
скопировать код в буфер обмена
function find( $fintParent , $id , $listId ) {
if ( $fintParent [ $id ] [ 'pid' ] != 0) {
$listId [ ] = $fintParent [ $id ] [ 'pid' ] ;
find( $fintParent , $fintParent [ $id ] [ 'pid' ] , $listId ) ;
}
return $listId ;
}
Где ошибка?
Сейчас заносит в массив только одного (первого) родителя...
Kubert
Отправлено: 23 Августа, 2011 - 18:35:57 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД
Ответов: 24 Просмотров: 114
LIME
Ты меня уж прости)!
Я пытаюсь понять, серьезно!
У тебя последний вариант работает?!
У меня 2 ошибки...
Notice: Undefined индекса: 1 вход / var/www/clients/client2/web7/web /test/26/index.php в строке 23
Фатальная ошибка: Только переменные могут быть переданы по ссылке в / var/www/clients/client2/web7/web /test/26/index.php в строке 24
Короче, буду пробывать, отпишу завтра или вечером... Сейчас уже не могу...
Kubert
Отправлено: 23 Августа, 2011 - 18:06:13 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД
Ответов: 24 Просмотров: 114
LIME
Чтото не работает...
CODE (
htmlphp ):
скопировать код в буфер обмена
mysql_connect("localhost","root","webmaster") or die (mysql_error());
mysql_select_db("mydemo") or die (mysql_error());
mysql_query("set character_set_client ='cp1251'");
mysql_query("set character_set_results ='cp1251'");
mysql_query("set collation_connection ='cp1251_general_ci'");
$queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
while($row = mysql_fetch_assoc($queryresult)){
$arrAll[] = array(
'id'=>$row['id'],
'pid'=>$row['pid'],
'name'=>$row['name'],
'idObject'=>$row['idObject']
);
}
function toTree(&$arrAll){
foreach($arrAll as &$val){
if(isset($val['pid'])){
$val['pid']=$arrAll['pid'];
toTree($val['pid']);
}
}
}
toTree($arrAll);
print_r($val);
Kubert
Отправлено: 23 Августа, 2011 - 17:15:48 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД
Ответов: 24 Просмотров: 114
Господа хотелось бы продолжить тему, так как достиг неких результатов, но не финишировал!
Даю все что имею!
БД:
CODE (
SQL ):
скопировать код в буфер обмена
id = обычный ID
pid = его родитель
sort = сортировка
name = имя
idObject = ссылка на какой- то id объекта ( это не важно)
id | pid | sort | name | idObject
1 | 0 | 9999 | Категория 1 | ###
2 | 1 | 9999 | Категория 1. 1 | ###
3 | 1 | 9999 | Категория 1. 2 | ###
4 | 3 | 9999 | Категория 1. 2. 1 | ###
5 | 4 | 9999 | Категория 1. 2. 1. 1 | ###
6 | 4 | 9999 | Категория 1. 2. 1. 2 | ###
7 | 0 | 9999 | Категория 2 | ###
8 | 0 | 9999 | Категория 3 | ###
и так далее...
ЗАДАЧА:
Необходимо преобразовать данные из MySQL в массив такого вида:
CODE (
htmlphp ):
скопировать код в буфер обмена
array ( 'id' => '1' , 'name' => 'Категория 1' , 'url' => '###' , 'tree' => array
( array ( 'id' => '2' , 'name' => 'Категория 1.1' , 'url' => '###' ) , array ( 'id' => '3' , 'name' => 'Категория 1.2' , 'url' => '###' , 'tree' => array
( array ( 'id' => '4' , 'name' => 'Категория 1.2.1' , 'url' => '###' , 'tree' => array
( array ( 'id' => '5' , 'name' => 'Категория 1.2.1.1' , 'url' => '###' ) , array ( 'id' => '6' , 'name' => 'Категория 1.2.1.2' , 'url' => '###' ) ) ) ,
) ) ,
) ) ,
array ( 'id' => '7' , 'name' => 'Категория 2' , 'url' => '###' ) , array ( 'id' => '8' , 'name' => 'Категория 3' , 'url' => '###' ) ) ;
ДЕЛАЮ ТАК:
mysql_connect("localhost","root","webmaster") or die (mysql_error());
mysql_select_db("mydemo") or die (mysql_error());
$queryresult = mysql_query('SELECT id,pid,name,idObject FROM category ORDER BY sort,id');
while($row = mysql_fetch_assoc($queryresult)){
$arrAll[] = array(
'id'=>$row['id'],
'pid'=>$row['pid'],
'name'=>$row['name'],
'idObject'=>$row['idObject']
);
}
Теперь осталось только "переконвертировать" массив из одного вида в другой с помощью рекурсивной функции.
Но у меня не выходит.
Kubert
Отправлено: 23 Августа, 2011 - 11:12:42 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД
Ответов: 24 Просмотров: 114
LIME не понимаю!
у меня вот что...
Спойлер (Отобразить )
PHP:
скопировать код в буфер обмена
[ 0 ] =>
object( stdClass) #3 (11) {
[ "name" ] =>
string( 2 ) "id"
[ "orgname" ] =>
string( 2 ) "id"
[ "table" ] =>
string( 8 ) "category"
[ "orgtable" ] =>
string( 8 ) "category"
[ "def" ] =>
string( 0 ) ""
[ "max_length" ] =>
int( 2 )
[ "length" ] =>
int( 255 )
[ "charsetnr" ] =>
int( 63 )
[ "flags" ] =>
int( 49667 )
[ "type" ] =>
int( 3 )
[ "decimals" ] =>
int( 0 )
}
[ 1 ] =>
object( stdClass) #4 (11) {
[ "name" ] =>
string( 3 ) "pid"
[ "orgname" ] =>
string( 3 ) "pid"
[ "table" ] =>
string( 8 ) "category"
[ "orgtable" ] =>
string( 8 ) "category"
[ "def" ] =>
string( 0 ) ""
[ "max_length" ] =>
int( 1 )
[ "length" ] =>
int( 255 )
[ "charsetnr" ] =>
int( 63 )
[ "flags" ] =>
int( 32768 )
[ "type" ] =>
int( 3 )
[ "decimals" ] =>
int( 0 )
}
[ 2 ] =>
object( stdClass) #5 (11) {
[ "name" ] =>
string( 4 ) "name"
[ "orgname" ] =>
string( 4 ) "name"
[ "table" ] =>
string( 8 ) "category"
[ "orgtable" ] =>
string( 8 ) "category"
[ "def" ] =>
string( 0 ) ""
[ "max_length" ] =>
int( 17 )
[ "length" ] =>
int( 255 )
[ "charsetnr" ] =>
int( 8 )
[ "flags" ] =>
int( 0 )
[ "type" ] =>
int( 253 )
[ "decimals" ] =>
int( 0 )
}
}
(Добавление)
Может мы вообще о разном?))) И я совсем ничего не понимаю...
Kubert
Отправлено: 23 Августа, 2011 - 10:26:47 • Тема: Рекурсивное создание массива • Форум: SQL и Архитектура БД
Ответов: 24 Просмотров: 114
вот так:
CODE (
htmlphp ):
скопировать код в буфер обмена
array ( 'k_item' => 1 , 's_name' => '1' , 'a_tree' => array ( array ( 'k_item' => 2 , 's_name' => '1.1' , 'a_tree' => array ( array ( 'k_item' => 3 , 's_name' => '1.1.1' , 'a_tree' => array ( ) ) , array ( 'k_item' => 4 , 's_name' => '1.1.2' , 'a_tree' => array ( ) ) , array ( 'k_item' => 5 , 's_name' => '1.1.3' , 'a_tree' => array ( array ( 'k_item' => 6 , 's_name' => '1.1.3.1' , 'a_tree' => array ( ) ) ) ) ,
) ) ,
array ( 'k_item' => 7 , 's_name' => '1.2' , 'a_tree' => array ( ) ) , array ( 'k_item' => 8 , 's_name' => '1.3' , 'a_tree' => array ( array ( 'k_item' => 9 , 's_name' => '1.3.1' , 'a_tree' => array ( ) ) , array ( 'k_item' => 10 , 's_name' => '1.3.2' , 'a_tree' => array ( ) ) ) ) ,
array ( 'k_item' => 11 , 's_name' => '1.4' , 'a_tree' => array ( array ( 'k_item' => 12 , 's_name' => '1.4.1' , 'a_tree' => array ( ) ) ) ) ,
) ) ,
array ( 'k_item' => 13 , 's_name' => '2' , 'a_tree' => array ( ) ) , array ( 'k_item' => 14 , 's_name' => '3' , 'a_tree' => array ( array ( 'k_item' => 15 , 's_name' => '3.1' , 'a_tree' => array ( ) ) ) )
) ;
(Добавление)
помойму получилось... вот:
CODE (
htmlphp ):
скопировать код в буфер обмена
function mym($i){
$res = mysql_query("SELECT * FROM category WHERE pid='$i'");
$topmenu = mysql_fetch_array($res);
if(isset($topmenu['id'])){
do{
echo $topmenu['name'].'< br> ';
mym($topmenu['id']);
}while($topmenu = mysql_fetch_array($res));
}
return $i;
}
mym(0);
(Добавление)
опять запутался....
как теперь в массив внести все это безобразие, а потом еще и вынести его из функции...
Kubert
Отправлено: 23 Августа, 2011 - 10:12:34 • Тема: вывод список таблиц с бд • Форум: SQL и Архитектура БД
Ответов: 1 Просмотров: 18
PATCH пишет: тему просьба удалить) нашел ответ SHOW TABLES ) какое логическо название однако)
Ну и ответил бы сам себе, чтобы другие подсмотрели.
Страниц (13): « 1 2 3 4 [5] 6 7 8 9 ... » В конец
Powered by ExBB FM 1.0 RC1. InvisionExBB