[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Рекурсия с бд
j11
Всем доброго времени суток. У меня возникла такая проблема. Есть бд след вида:

id pid title alias
1 0 one one
2 1 two two
3 2 three three
4 3 for for

У нас есть алиасы. Нужно написать(я так понимаю рекурсию) скрипт типа "Обновление". Он пробегается по БД и переписывает алиасы в зависимости от их родителей. Причём вложенность может быть любая.

тоесть ссылки по id после обработки должны выглядеть так:
1. one
2. one/two
3. one/two/three
4. one/two/three/for

Тоесть выбирают своих родителей, те своих и так далее пока не закончится и потом UPDATE в БД.

Помогите пожалуйста. Перерыл нэт весь. Сам пишу уже 2-ой день. но ничё придумать не могу. Курсач через 2 дня здать надо(((((((((






Спустя 7 минут, 34 секунды (7.11.2010 - 20:54) kirik написал(а):
Покажете что у вас получилось?

Спустя 3 минуты, 25 секунд (7.11.2010 - 20:58) inpost написал(а):
j11
Раз для универа, то 4 пишется как four.

Спустя 5 минут, 22 секунды (7.11.2010 - 21:03) j11 написал(а):

$sql = mysql_query('SELECT * FROM `content`');
for($data = array(); $row = mysql_fetch_assoc($sql); $data[] = $row);

// -- Упрощаю массив
foreach($data as $v=>$k){
$mass[] = $k;
}


foreach($mass as $v){


foreach($mass as $v2){
if($v['id'] == $v2['pid']){
$alias = '/'.$v['alias'].'/'.$v2['alias'].'/';
mysql_query("UPDATE `content` SET `alias` = '".$alias."' WHERE `id` =".$v2['id']." LIMIT 1");

}
}


}


но тут только выбирает родителя предыдущего. а должно выбирать и родителя родителя и так далее. не хватает мозгов как сделать. заранее благодарен

Спустя 10 минут, 52 секунды (7.11.2010 - 21:14) kirik написал(а):
Не самый простой короткий, но рабочий вариант с массивом:
тыц
// Данные
$arr = array(
array('id' => '1', 'pid' => '0', 'title' => 'one', 'alias' => 'one'),
array('id' => '2', 'pid' => '1', 'title' => 'two', 'alias' => 'two'),
array('id' => '3', 'pid' => '2', 'title' => 'three', 'alias' => 'three'),
array('id' => '4', 'pid' => '3', 'title' => 'four', 'alias' => 'four')
);


/* делаем новый массив вида:
Array
(
[pid] => Array
(
[..] => Array
(
[id] => ..
[pid] => ..
[title] => ..
[alias] => ..
)

)
...
)
*/

$parr = array();
foreach($arr as &$l) {
$parr[$l['pid']][] = &$l;
}
unset($l);

// сортируем по ключам (по pid)
ksort($parr,SORT_NUMERIC);

// Изменяем алиасы старого массива
$alias = '';
foreach($parr as &$l) {
foreach($l as &$i) {
$i['alias'] = '/' . $alias .= $i['alias'] . '/';
}
unset($i);
}
unset($l);


print_r($parr);

/* результат:
Array
(
[0] => Array
(
[0] => Array
(
[id] => 1
[pid] => 0
[title] => one
[alias] => /one/
)

)

[1] => Array
(
[0] => Array
(
[id] => 2
[pid] => 1
[title] => two
[alias] => /one/two/
)

)

[2] => Array
(
[0] => Array
(
[id] => 3
[pid] => 2
[title] => three
[alias] => /one/two/three/
)

)

[3] => Array
(
[0] => Array
(
[id] => 4
[pid] => 3
[title] => four
[alias] => /one/two/three/four/
)

)

)
*/

Попробуй переделать для работы с БД.

Спустя 9 минут, 24 секунды (7.11.2010 - 21:24) j11 написал(а):
оооо....огромное человеческое СПАСИБО. работает))))))))))) попробую под бд склепать......большое спасибо ещё раз

Спустя 1 минута, 33 секунды (7.11.2010 - 21:25) Sanchopansa написал(а):
Вот с рекурсией функции пример

<?php
$arr = array(
array(
'name_r' => 'Категория 1',
'id' => 1,
'parent' => 0
),
array(
'name_r' => 'Категория 2',
'id' => 2,
'parent' => 0
),
array(
'name_r' => 'Категория 3',
'id' => 3,
'parent' => 0
),
array(
'name_r' => 'Подкатегория 1',
'id' => 4,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 2',
'id' => 5,
'parent' => 1
),
array(
'name_r' => 'Подкатегория 3',
'id' => 6,
'parent' => 3
),
array(
'name_r' => 'Подподкатегория 4',
'id' => 7,
'parent' => 6
),
array(
'name_r' => 'Подподкатегория 5',
'id' => 8,
'parent' => 4
)
);

function getTree($arr, $parent = 0, $rotation = 0)
{
$space = '';
$tmp_rot = $rotation;
while ($tmp_rot)
{
$space .= '-';
$tmp_rot--;
}
foreach ($arr as $cat){
if ($cat['parent'] == $parent)
{
echo $space.$cat['name_r'] . "\n\r";
getTree(&$arr, $cat['id'], $rotation+1);
}
}
}


getTree($arr);

?>

Спустя 43 минуты, 55 секунд (7.11.2010 - 22:09) kirik написал(а):
Вот еще вариант, по-прозрачнее:
тыц
// Данные
$arr = array(
array('id' => '1', 'pid' => '0', 'title' => 'one', 'alias' => 'one'),
array('id' => '2', 'pid' => '1', 'title' => 'two', 'alias' => 'two'),
array('id' => '3', 'pid' => '2', 'title' => 'three', 'alias' => 'three'),
array('id' => '4', 'pid' => '3', 'title' => 'four', 'alias' => 'four')
);


// создаем массив с алиасами. ключ - pid, значение - алиас
$stack = array();
for($i = 0, $c = count($arr); $i < $c; $i++) {
$stack[$arr[$i]['id']] = $arr[$i]['alias'];
}

// сортируем по pid
ksort($stack, SORT_NUMERIC);

// проходимся по массиву с алиасами и добавляем к каждому элементу родительский алиас
$stackline = '/';
foreach($stack as &$s) {
$s = $stackline .= $s . '/';
}
unset($s);

// изменяем алиасы для основного массива
for($i = 0, $c = count($arr); $i < $c; $i++) {
$arr[$i]['alias'] = $stack[$arr[$i]['id']];
}

print_r($arr);

Спустя 34 минуты, 10 секунд (7.11.2010 - 22:43) Joker написал(а):
j11
а какая бд?

Спустя 6 дней, 19 часов, 21 минута, 16 секунд (14.11.2010 - 18:04) j11 написал(а):
спасибо всем за помощь но работает немножко не так.
берём пример kirik.
если мы поменяем pid то ничего не изменится. тоесть если pid=0 а id = 3, то алиас возьмёт алиасы с id=1, id=2 и получится /алиас с id1/алиас с id2/наш последний алиас с id3. тоесть как бы выстраивается по id а не по pid.

с pid=0 алиас например должен быть /alias1/
а с pid = 1 алиас должен быть /alias с id=1/наш alias/

Спустя 1 день, 5 часов, 29 минут, 11 секунд (15.11.2010 - 23:34) j11 написал(а):
ребята, помогите плиз. оч надо

Спустя 1 час, 21 минута, 58 секунд (16.11.2010 - 00:56) kirik написал(а):
Да, чет тупанул.. Вот так должно работать:
// Данные
$arr = array(
array('id' => '1', 'pid' => '0', 'title' => 'one', 'alias' => 'one'),
array('id' => '2', 'pid' => '1', 'title' => 'two', 'alias' => 'two'),
array('id' => '3', 'pid' => '1', 'title' => 'three', 'alias' => 'three'),
array('id' => '4', 'pid' => '3', 'title' => 'four', 'alias' => 'four')
);



$parr = array();
for($i = 0, $c = count($arr); $i < $c; $i++) {
$parr[$arr[$i]['id']] = $arr[$i];
}
foreach($parr as &$e) {
if($e['pid'] != 0) {
isset($parr[$e['pid']]) or die('Some relations are broken.');
$e['pid'] != $e['id'] or die('Link recursion.');
$e['pid'] = &$parr[$e['pid']];
}
}

unset($e);
foreach($arr as &$v) {
$result = array();
get_path($parr[$v['id']], $result);
$v['alias'] = '/' . implode('/', array_reverse($result)) . '/';
}
unset($v);

function get_path($arr, &$result) {
$result[] = $arr['alias'];
!
is_array($arr['pid']) or get_path($arr['pid'], $result);
}

print_r($arr);

Если id == pid - будет ошибка что элемент ссылается сам на себя, если элемент указанный в pid отсутствует - будет ошибка о нарушении ссылок.

Спустя 11 часов, 20 минут, 51 секунда (16.11.2010 - 12:16) j11 написал(а):
огромное человеческое спасибо. лови +
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.