Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> построить дерево по данным из БД 
:(
    Опции темы
Jozefina
Дата 3.3.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.10.2007
Где: Беларусь

Репутация: нет
Всего: нет



подскажите, пожалуйста!
есть массив из БД
    [1]1;8;25;36
    [2]1;8;24;37
    [3]2;6
    [4]2;5;29
    [5]2;6;38
    [6]3;17
который необходимо превратить в дерево такого типа
    *1
    __*8
    ____*24
    ______*37
    ____*25
    ______*36
    *2
    __*5
    ____*29
    __*6
    ______*38
    *3
    __*17
как тут лучше поступить???? при этом , знаю точно, что родителя будет только три(1,2,3), а глубина не больше 4 вложения...
 smile 

Это сообщение отредактировал(а) Jozefina - 4.3.2009, 13:55
PM MAIL   Вверх
IZ@TOP
Дата 3.3.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата(Jozefina @  3.3.2009,  19:36 Найти цитируемый пост)
есть массив из БД

[1]1;8;25;36
[2]1;8;24;37
[3]2;6
[4]2;5;29
[5]2;6;38
[6]3;17


О_О *фшоке* Для понимания, хотелось бы условия задачи услышать, поскольку я не представляю как вообще приведенные данные интерпретировать.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Jozefina
Дата 3.3.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.10.2007
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(IZ@TOP @ 3.3.2009,  19:55)
Цитата(Jozefina @  3.3.2009,  19:36 Найти цитируемый пост)
есть массив из БД

[1]1;8;25;36
[2]1;8;24;37
[3]2;6
[4]2;5;29
[5]2;6;38
[6]3;17


О_О *фшоке* Для понимания, хотелось бы условия задачи услышать, поскольку я не представляю как вообще приведенные данные интерпретировать.

полученный элемент массива имеет до 4 уровня вложенности, который представлен в одной строке
к примеру,  "1;8;25;36"
родитель 1 имеет дочерний элемент 8, у которого, в свою очередь, есть свой дочерний элемент 25, и т.д.
как видно, уровни отделены точкой с запятой...
эта запись в БД-логе может повторяться"1;8;25;36",
поэтому необходимо вытянуть массив этих строк из БД и представить(записать) в виде нормального дерева (массива)...
 smile 

Это сообщение отредактировал(а) Jozefina - 4.3.2009, 13:54
PM MAIL   Вверх
Цербер
Дата 4.3.2009, 10:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 21.11.2007

Репутация: нет
Всего: 1



Jozefina ну так выводи всё цикле и в итоге у тебя получится 4 цикла:
в первом вытаскиваешь из базы все данные по 1 значению элемента массива
во втором проверяешь дочерние элементы и т.д. примерно будет выглядеть так:
Код

$query = mysql_query("anyone select");
while($row = mysql_fetch_array($query)){
     echo $row['title'];
     $query_second = mysql_query("anyone select where parent_id='".$row['id']."' ");
     while($row_second = mysql_fetch_array($query_second)){
         echo $row_second['title'];  
            продолжай циклы пока разветвления не закончатся  
     }
}
 
это самый лёгкий способ=) так же можешь использовать один сложный запрос с помощью JOIN-а и псевдонимов для полей! 

Это сообщение отредактировал(а) Цербер - 4.3.2009, 10:35
PM MAIL ICQ   Вверх
Jozefina
Дата 4.3.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.10.2007
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(Цербер @ 4.3.2009,  10:32)
Jozefina ну так выводи всё цикле и в итоге у тебя получится 4 цикла:
в первом вытаскиваешь из базы все данные по 1 значению элемента массива
во втором проверяешь дочерние элементы и т.д. примерно будет выглядеть так:
Код

$query = mysql_query("anyone select");
while($row = mysql_fetch_array($query)){
     echo $row['title'];
     $query_second = mysql_query("anyone select where parent_id='".$row['id']."' ");
     while($row_second = mysql_fetch_array($query_second)){
         echo $row_second['title'];  
            продолжай циклы пока разветвления не закончатся  
     }
}
 
это самый лёгкий способ=) так же можешь использовать один сложный запрос с помощью JOIN-а и псевдонимов для полей!

что-то я не совсем поняла...
у меня в БД в поле "location" одна запись такая "1;8;25;36", вторая такая "1;8;24;37"...которые я и вытаскиваю в массив...
как я могу вытащить из базы все данные по 1 значению элемента массива???т.е. из записи "1;8;25;36" я получу "1", а потом "8", потом "25" и т.д.
"SELECT id, location as title from database"-первый запрос, а второй: "SELECT id, location as title from database where parent_id='".$row['id']"
 smile 
я думала, необходимо использовать рекурсивную функцию ,это во-первых, а во-вторых использовать то, что я заранее знаю первых родителей("1","2","3")

Это сообщение отредактировал(а) Jozefina - 4.3.2009, 12:59
PM MAIL   Вверх
skyboy
Дата 4.3.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



сходу код не напишу, но чтоб совсем не бросать без поддержки, предлагаю посмотреть тему "Помогите составить дерево" - там есть вариант построение многомерного массива по матрице смежности(рекурсивно и через ссылки). У тебя не совсем матрица смежности, но, я уверен, вполне можно  тот код под твои условия адаптировать.

PM MAIL   Вверх
dmitryttt
Дата 4.3.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Может (если еще не поздно) перейти к другой схеме таблиц в БД ... Хранить в одной ячейке данные типа 1;2;3;4 .. крайне нежелательно...и думаю где-то вы можете упереться в большие проблемы

схема  (id | id_parent | data) либо (id | data + id | id_parent) гораздно практичнее
PM MAIL ICQ   Вверх
Jozefina
Дата 4.3.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.10.2007
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(dmitryttt @ 4.3.2009,  13:38)
Может (если еще не поздно) перейти к другой схеме таблиц в БД ... Хранить в одной ячейке данные типа 1;2;3;4 .. крайне нежелательно...и думаю где-то вы можете упереться в большие проблемы

схема  (id | id_parent | data) либо (id | data + id | id_parent) гораздно практичнее

с радостью бы, но надо исходить из того, что есть...
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Ну, если предположить, что я вас действительно правильно понял - скрипт будет выглядеть примерно таким образом.

Код

<?php

function aWnFormat($ns, &$array) {
    $n = array_shift($ns);
    if (!array_key_exists($n, $array)) {
        $array[$n] = array();
    }

    ksort($array);
    if (sizeof($ns)) {
        aWnFormat($ns, $array[$n]);
    }
}

function aWnFormatPrint($ns, $l = 0) {
    foreach($ns as $n => $sn) {
        print str_pad("*" . $n, $l+strlen($n), "_", STR_PAD_LEFT) . "\n";
        if(is_array($sn)) {
            aWnFormatPrint($sn, $l+2);
        }
    }
}

// rows from db
$row[]="1;8;25;36";
$row[]="1;8;24;37";
$row[]="2;6";
$row[]="2;5;29";
$row[]="2;6;38";
$row[]="3;17";

$array = array();

foreach ($row as $s) {
    $ns = explode(';', $s);
    aWnFormat($ns, $array);
}

ksort($array);
aWnFormatPrint($array);

?>



Просто было любопытно мозки размять. По идее, эти две функи поддерживают бесконечно возможное число родителей и вложений (насколько мощностей хватит smile).

P.S. aWnFormat - array woman format)))

Это сообщение отредактировал(а) IZ@TOP - 4.3.2009, 14:42


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Jozefina
Дата 4.3.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 1.10.2007
Где: Беларусь

Репутация: нет
Всего: нет



IZ@TOP
спасибочки!
PM MAIL   Вверх
IZ@TOP
Дата 4.3.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



 smile 
Но все равно, советую учиться думать собственной головой.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.