Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Дамп массива
 
 автор: Eugene77   (12.07.2009 в 14:30)   письмо автору
 
 

Для работы программы требуется большой массив.
Вытаскиваю из базы таблицу целиком, и преобразую её в сложный массив, но получается очень уж долго.
Может быть есть более быстрый способ создания массива из какого-нибудь заранее сделанного дампа или ещё каким-нибудь способом?

  Ответить  
 
 автор: Valick   (12.07.2009 в 14:36)   письмо автору
 
   для: Eugene77   (12.07.2009 в 14:30)
 

Больше чем уверен всё что Вы пытаетесь сделать с массивом на РНР, можно сделать с базой средствами СУБД (если нельзя, то значит неправильно организована база) а не вытаскивать таблицу целиком и "шаманить".

  Ответить  
 
 автор: Eugene77   (12.07.2009 в 15:00)   письмо автору
 
   для: Valick   (12.07.2009 в 14:36)
 

Данные имеют древовидную структуру.
Структура массива соответствует структуре данных, а то, что я могу получить в качестве результирующего набора - таблица.
Так что "шаманство" неизбежно.

Отсюда и та сложность, что подгружать данные частями (по мере надобности) невозможно.

  Ответить  
 
 автор: Рома   (12.07.2009 в 14:47)   письмо автору
 
   для: Eugene77   (12.07.2009 в 14:30)
 

Если после получения сложного массива вы продолжаете работу с ним, т.е. выводите некоторые его элементы, то получение сложного массива в этом случае нецелесообразно. Выбирать из базы нужно ровно столько данных, сколько требуется для отображения конкретной страницы.

  Ответить  
 
 автор: Guitarist   (13.07.2009 в 06:08)   письмо автору
 
   для: Eugene77   (12.07.2009 в 14:30)
 

А можно мне у Вас тут поумничать?! =)))
Eugene77, Мне очень интересно, как Вы умудрились запихнуть древовидную структуру в одну таблицу??? Поделитесь опытом плиз =) Полностью согласен с Valick, нужно базу перепроектировать под Ваши задачи, ну или страдать геморроем типа сериализации кусков массива и прочим =)

  Ответить  
 
 автор: Eugene77   (13.07.2009 в 19:52)   письмо автору
 
   для: Guitarist   (13.07.2009 в 06:08)
 

>А можно мне у Вас тут поумничать?! =)))
>Eugene77, Мне очень интересно, как Вы умудрились запихнуть древовидную структуру в одну таблицу??? Поделитесь опытом плиз =)

Дурное дело не хитое:
CREATE TABLE tree(
id INT,
node INT,
parent INT
)


Полностью согласен с Valick, нужно базу перепроектировать под Ваши задачи,

Будьте добры, посоветуйте как перепроектировать базу!

ну или страдать геморроем типа сериализации кусков массива и прочим =)

Это будет быстрее, чем обращение к базе?

  Ответить  
 
 автор: Саня   (13.07.2009 в 21:55)   письмо автору
 
   для: Eugene77   (13.07.2009 в 19:52)
 

> Будьте добры, посоветуйте как перепроектировать базу!
Опишите задачу подробнее. А то объяснение "из базы в массив" очень куцо.

  Ответить  
 
 автор: Eugene77   (14.07.2009 в 21:07)   письмо автору
 
   для: Саня   (13.07.2009 в 21:55)
 

Задача:
Быстро и целиком вносить в PHP дерево данных

  Ответить  
 
 автор: Саня   (14.07.2009 в 21:10)   письмо автору
 
   для: Eugene77   (14.07.2009 в 21:07)
 

> но получается очень уж долго.
Долго это сколько? Покажите скрипт. А данные в память целиком вмещаются? Это должно работать при каждом посещении пользователей или время от времени запускается админом? Как часто предполагается изменение данных в таблице?

CREATE TABLE tree( 
id INT, 
node INT, 
parent INT 
)
Это полная схема таблицы или вы опустили некоторые поля? Покажите полную схему. Можете затереть имена полей, мне интересны лишь их типы.

  Ответить  
 
 автор: Trianon   (14.07.2009 в 21:45)   письмо автору
 
   для: Eugene77   (14.07.2009 в 21:07)
 

Чем Вас не устроил код, который я предложил (01.07.2009 в 21:26) ?
Неужели долго выполняется?

  Ответить  
 
 автор: Eugene77   (16.07.2009 в 19:25)   письмо автору
 
   для: Trianon   (14.07.2009 в 21:45)
 

>Чем Вас не устроил код, который я предложил (01.07.2009 в 21:26) ?
>Неужели долго выполняется?

Вы это имеете в виду?:
<? 
$tree 
= array(); 
$list = array(); 
while(
$row =  mysql_fetch_row($res)) 

    
$list[$row[0]] = array($row[1], $row[2]); 
    
$tree[$row[1]][] = $row[0]; 
}

Нет, конечно, выполняется он быстро.
Но он не создаёт древовидного массива.

Под древовидным массивом я подразумеваю в данном случае такую структуру, в которой ключи массива обозначают только рубрики не имеющие родителей. Значение элемента массива - это в свою очередь массив ключи которого - это только те рубрики, родителем которых является ключ предыдущей рубрики.

  Ответить  
 
 автор: Trianon   (16.07.2009 в 20:04)   письмо автору
 
   для: Eugene77   (16.07.2009 в 19:25)
 

пример?
Таблица из двух столбцов id, id_parent и древовидный массив ей соответствующий?

  Ответить  
 
 автор: Саня   (17.07.2009 в 12:26)   письмо автору
 
   для: Trianon   (16.07.2009 в 20:04)
 

Он, видимо, хочет рекурсию.

  Ответить  
 
 автор: Trianon   (17.07.2009 в 12:55)   письмо автору
 
   для: Саня   (17.07.2009 в 12:26)
 

рекурсию можно вести и по предложенному массиву, и "по древовидному" и по таблице БД и по файлу. :))
Eugene77 хочет странного. Но имеет право, лишь бы четко формулировал желания.

  Ответить  
 
 автор: Eugene77   (21.07.2009 в 20:59)   письмо автору
 
   для: Trianon   (17.07.2009 в 12:55)
 

array(
"растения" => array(
"деревья" => array("дубы", "клёны" ,"каштаны"),
"кустарники" => array(
"садовые" => array(
"декоративные" => array("самшит"),
"плодовые" => array("жимолость")
),
"дикие" => array("дереза")
)
);

  Ответить  
 
 автор: Eugene77   (21.07.2009 в 21:01)   письмо автору
 
   для: Trianon   (17.07.2009 в 12:55)
 

<?
array(
"растения" => array(
     
"деревья" => array("дубы""клёны" ,"каштаны"),
     
"кустарники" => array(
            
"садовые" => array(
                    
"декоративные" => array("самшит"),
                    
"плодовые"        => array("жимолость")
            ),
            
"дикие" => array("дереза")
      )
);

  Ответить  
 
 автор: Trianon   (22.07.2009 в 00:30)   письмо автору
 
   для: Eugene77   (21.07.2009 в 21:01)
 

Массив Вы привели. Кривой, правда.
А таблицу - нет.

  Ответить  
 
 автор: Eugene77   (23.07.2009 в 09:50)   письмо автору
 
   для: Trianon   (22.07.2009 в 00:30)
 

<?
array( 
"растения" => array( 
     
"деревья" => array("дубы""клёны" ,"каштаны"), 
     
"кустарники" => array( 
            
"садовые" => array( 
                    
"декоративные" => array("самшит"), 
                    
"плодовые"        => array("жимолость"
            ), 
            
"дикие" => array("дереза"
      ) 
);

растения -> деревья,
растения -> кустарники,
деревья -> дубы,
деревья -> клёны,
деревья -> каштаны,
кустарники -> садовые,
кустарники -> дикие,
садовые -> декоративные,
садовые -> плодовые,
декоративные -> самшит,
плодовые -> жимолость,
дикие -> дереза,

  Ответить  
 
 автор: Eugene77   (23.07.2009 в 09:56)   письмо автору
 
   для: Trianon   (22.07.2009 в 00:30)
 

Я, кстати, привёл не только массив и описал структуру таблицы(см. выше), но и в той теме, на которую вы ссылаетесь, привёл решение этой задачи.
Вопрос стоит в оптимизации решения.
Почему-то у меня не получается сделать его на основе передачи ссылок на элементы массива.
Поэтому получатся при рекурсивных вызовах большие куски массива приходится тащить через стек.
В общем чего-то я никак не могу уловить в РНР в отношении работы со ссылками.
Очень хотелось бы посмотреть как нормально грамотно написать такую функцию!

  Ответить  
 
 автор: Trianon   (23.07.2009 в 11:17)   письмо автору
 
   для: Eugene77   (23.07.2009 в 09:56)
 

Я спрашивал не про структуру (структуру Вы действительно привели), а про данные таблицы.

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

ортогональный массив выглядел бы так:
<?
array( 
"растения" => array( 
     
"деревья" => array("дубы" => array(), "клёны"=> array() ,"каштаны"=> array()), 
     
"кустарники" => array( 
            
"садовые" => array( 
                    
"декоративные" => array("самшит"=> array()), 
                    
"плодовые"        => array("жимолость"=> array()) 
            ), 
            
"дикие" => array("дереза"=> array()) 
      ) 
);


Моему варианту массива соответствует одна таблица БД
Вашему, как правило, две разные.

  Ответить  
 
 автор: Eugene77   (23.07.2009 в 12:24)   письмо автору
 
   для: Trianon   (23.07.2009 в 11:17)
 

Да, извините, именно такой массив мой скрипт и создаёт.

  Ответить  
 
 автор: Trianon   (23.07.2009 в 12:26)   письмо автору
 
   для: Eugene77   (23.07.2009 в 12:24)
 

дамп данных приведете?

  Ответить  
 
 автор: Trianon   (23.07.2009 в 12:28)   письмо автору
 
   для: Eugene77   (23.07.2009 в 12:24)
 

Именно какой?

  Ответить  
 
 автор: Eugene77   (24.07.2009 в 09:28)   письмо автору
 
   для: Trianon   (23.07.2009 в 12:28)
 

>Именно какой?
Да.

Мне кажется, что вы напрасно задаёте так много уточняющих вопросов:
Если вы знаете другую более удобную неизбыточную структуру таблицы для хранения данных древовидной структуры, то давно бы её привели.
Если ВЫ такой таблицы не знаете, то почему возникают сомнения что мы говорим о разном?
Если предположить, что я не догадался до этой структуры, то я "догадаюсь" о ней по вашему ответу.

  Ответить  
 
 автор: Trianon   (24.07.2009 в 09:56)   письмо автору
 
   для: Eugene77   (24.07.2009 в 09:28)
 

Вы привели одну структуру (23.07.2009 в 09:50). Я - другую (23.07.2009 в 11:17) .
Потом Вы пишете, что ошиблись, и что работаете с "именно такой" структурой (23.07.2009 в 12:24), не уточнив, $лять, с какой именно.
Но подтверждаете, что тоже считаете их разными (23.07.2009 в 12:26) .
На мой уточняющий вопрос - с какой же именно структурой (23.07.2009 в 12:28) Вы работаете, Вы отвечаете - да! (24.07.2009 в 09:28)

При всей абсурдности разговора, в нем остается одно более менее вменяемое место:
Мы говорим об разных структурах массива, но одной методике хранения данных в таблице.
И о соответствии одного другому.

и тут я читаю (24.07.2009 в 08:48) где внезапно оказываются две таблицы.

Идите-ка Вы в жопу....

  Ответить  
 
 автор: Eugene77   (24.07.2009 в 10:04)   письмо автору
 
   для: Trianon   (24.07.2009 в 09:56)
 

Из всего этого ясно, что меня интересует любой разумный метод работы с иерархией,
а вы либо не знаете, либо не хотите предложить ни одного.
(Я не говорю о избыточных структурах таблиц. Тут ссылку на них уже давали.)
В принципе, я и предполагал, что этим дело закончится.

  Ответить  
 
 автор: Trianon   (24.07.2009 в 10:15)   письмо автору
 
   для: Eugene77   (24.07.2009 в 10:04)
 

Из всего этого ясно другое. А именно, что Вас что-то интересует, но Вы не пытаетесь приложить даже минимума усилий, чтобы понятно объяснить, что именно.
Этот подход ("а чо думать-то? Спрошу - а там разберутся") виден во всех ваших постах.
И поэтому, не смотря на Ваш достаточно высокий , по сравнению с местным большинством, уровень, учить Вас чему-либо не тянет никогда.

  Ответить  
 
 автор: Trianon   (24.07.2009 в 10:08)   письмо автору
 
   для: Eugene77   (24.07.2009 в 09:28)
 

Вы задали базовый вопрос- как таблицу перегнать в массив. Быстро и аккуратно.
Я удивился вопросу (вроде не Ваш уровень) , но показал - как.
Вместо того, чтобы , как Вы пишете, догадаться, Вы стали юлить и сетовать на то, де, что вот массив нужен не такой, а другой.
Теперь Вы пишете, что Вас оказывается не создание массива интересует, а выбор структуры таблицы, хотя их всего-то раз, два и три. И все детально описаны.
Вы смерти моей хотите чтоли?

  Ответить  
 
 автор: Eugene77   (24.07.2009 в 16:14)   письмо автору
 
   для: Trianon   (24.07.2009 в 10:08)
 

>Вы задали базовый вопрос- как таблицу перегнать в массив. Быстро и аккуратно.
>Я удивился вопросу (вроде не Ваш уровень) , но показал - как.
>Вместо того, чтобы , как Вы пишете, догадаться, Вы стали юлить и сетовать на то, де, что вот массив нужен не такой, а другой.

Меня самого удивило, что то что вы предложили вы считаете древовидной структурой массива (речь идёт о теме на которую вы ссылались).

>Теперь Вы пишете, что Вас оказывается не создание массива интересует, а выбор структуры таблицы, хотя их всего-то раз, два и три. И все детально описаны.

Про выбор структуры таблицы я создавал отдельную тему, но так ничего и не взял из неё.
Ну, и остановился на самом простом. Именно поэтому я сделал вывод, что со структурой таблицы разночтений не будет и именно поэтому считаю ваши уточняющие вопросы пустыми.

>Вы смерти моей хотите чтоли?

Я не могу ещё более конкретизировать вопрос имея перед собой свою задачу.
Какой мне нужен массив? Да любой, но чтобы его можно было обходить ветку за веткой. Только и всего. А какая структура в РНР этому соответствует? Вы много знаете? Я - только одну, если не считать отличия в концах веточек, которые вы назвали ортогональностью. Но любые отличия на кончиках массива для меня значения не имеют. Да и вообще для практики их значение будет минимально. Так что мне кажется, что несмотря на краткость формулировки, задача вполне определена (мы говорим о теме, на которую вы сослались). То есть любое решение, предложенное с вашей стороны, удовлетворит мой интерес.

Тут два варинта: либо вы не хотите это замечать упираясь в "педагогические соображения",
либо я что-то глубоко не понимаю в древовидной структуре. Ну, тогда - поясните, какие тут могут быть ещё варианты, мною не замеченные.

  Ответить  
 
 автор: Trianon   (24.07.2009 в 23:43)   письмо автору
 
   для: Eugene77   (24.07.2009 в 16:14)
 

>Меня самого удивило, что то что вы предложили вы считаете древовидной структурой массива (речь идёт о теме на которую вы ссылались).

Вот. Смотрите внимательно.
http://softtime.ru/forum/read.php?id_forum=3&id_theme=13924

>
>>Теперь Вы пишете, что Вас оказывается не создание массива интересует, а выбор структуры таблицы, хотя их всего-то раз, два и три. И все детально описаны.
>

>Про выбор структуры таблицы я создавал отдельную тему, но так ничего и не взял из неё.
>Ну, и остановился на самом простом. Именно поэтому я сделал вывод, что со структурой таблицы разночтений не будет и именно поэтому считаю ваши уточняющие вопросы пустыми.

Простите, то, что Вы так считаете, конечно, позволяет Вам на них не отвечать.
Но тогда какой смысл ждать ответ от меня? Я-то их пустыми не считаю.


>>Вы смерти моей хотите чтоли?
>

>Я не могу ещё более конкретизировать вопрос имея перед собой свою задачу.
>Какой мне нужен массив? Да любой,
Да Вы его уже привели.
Так трудно нарисовать
INSERT INTO tbl (id, parent_id, name) VALUES 
(1, 0, 'Растения'),
(2, 1, 'Деревья'),
(3, 2, 'Дубы'),
(и т.д.) ?!

Я вот в упор не понимаю, почему это должен делать я, в то время, когда потребность в знаниях испытываете Вы!

  Ответить  
 
 автор: Eugene77   (25.07.2009 в 08:50)   письмо автору
 
   для: Trianon   (24.07.2009 в 23:43)
 

>Вот. Смотрите внимательно.
>http://softtime.ru/forum/read.php?id_forum=3&id_theme=13924
>

Да, признаю, что для рекурсивного обхода дерева, массив совсем не обязательно делать древовидным. Ваше решение проще. А моя идея соответствия структуры данных и структуры массива должна была для вас выглядеть надуманной. Просто я не такой опытный программист...

>Простите, то, что Вы так считаете, конечно, позволяет Вам на них не отвечать.
>Но тогда какой смысл ждать ответ от меня? Я-то их пустыми не считаю.
>

Я это понимаю. Поэтому отвечаю, но предупреждаю вас, что обсуждение заходит в ту область, которая для меня значения не имеет.

>Так трудно нарисовать

INSERT INTO tbl (id, parent_id, name) VALUES 
(1, 0, 'Растения'),
(2, 1, 'Деревья'),
(3, 2, 'Дубы'),
(4, 1, 'Кусты'),
(5, 4, 'Малина'),
(6, 5, 'Малина садовая'),
(7, 5, 'Малина домашняя')

>
>Я вот в упор не понимаю, почему это должен делать я, в то время, когда потребность в знаниях испытываете Вы!

Ну, это да. Если нарисовать - это сэкономит минутку вашего времени. Буду приводить образец готового дампа.

Теперь вопрос, получается, потерял практическое значение для меня.
Но осталось желание посмотреть образец качественно написанного кода.
Возможно ли создать именно древовидный массив без такого громоздкого кода как сочинил я? Мне бы очень хотелось взглянуть как вы там будете передавать ссылки!

Спасибо за во многом справедливую критику!

  Ответить  
 
 автор: Trianon   (25.07.2009 в 10:56)   письмо автору
 
   для: Eugene77   (25.07.2009 в 08:50)
 

<?php
    
require_once('dbconfig.php');

   function 
level($list$tree$id)
   {
       echo 
"<blockquote> "$list[$id]['name'];
       if(isset(
$tree[$id]))
         for(
$n=count($tree[$id]), $i 0$i $n$i++)
           
level($list$tree$tree[$id][$i]);
       echo 
"</blockquote>";
   }

   
$tree = array();     $list = array();

   
$query " SELECT  id, parent_id, name FROM tbl order by id";
   if((
$res=mysql_query($query)) != 0)
     while((
$row=mysql_fetch_ASSOC($res)) != 0)
     {
       
$list[$row['id']] = $row;
       list(
$id$parent_id) = array($row['id'],$row['parent_id']);
       
$tree[$parent_id][] = $id;
     }

    
level($list$tree1);
?>


<?php
    
require_once('dbconfig.php');

   function 
makearr($list$tree$id)
   {
       
$v = array();
       if(isset(
$tree[$id]))
         for(
$n=count($tree[$id]), $i 0$i $n$i++)
         {
             
$key $tree[$id][$i];
             
$v[$list[$key]['name']] = makearr($list$tree$key);
         }
       return 
$v;
   }

   
$tree = array();     $list = array();

   
$query " SELECT  id, parent_id, name FROM tbl order by id";
   if((
$res=mysql_query($query)) != 0)
     while((
$row=mysql_fetch_ASSOC($res)) != 0)
     {
       
$list[$row['id']] = $row;
       list(
$id$parent_id) = array($row['id'],$row['parent_id']);
       
$tree[$parent_id][] = $id;
     }

    
$arr makearr($list$tree1);    unset($list);     unset($tree); 
    echo 
"<pre>";     print_r($arr);     echo "</pre>";

?>

  Ответить  
 
 автор: Eugene77   (25.07.2009 в 15:43)   письмо автору
 
   для: Trianon   (25.07.2009 в 10:56)
 

Спасибо!
Сейчас буду разбираться.

  Ответить  
 
 автор: Eugene77   (23.07.2009 в 12:26)   письмо автору
 
   для: Trianon   (23.07.2009 в 11:17)
 

Да, две разные.
Но проблема, как вы понимаете, только с одной.

  Ответить  
 
 автор: Trianon   (23.07.2009 в 12:27)   письмо автору
 
   для: Eugene77   (23.07.2009 в 12:26)
 

>Да, две разные.
ну и как вас понимать после этого?

  Ответить  
 
 автор: Eugene77   (24.07.2009 в 08:48)   письмо автору
 
   для: Trianon   (23.07.2009 в 12:27)
 

Одна таблица содержит "листья" со ссылками к какой веточке они крепятся (могут крепиться к любой). С этой таблицей нет никаких трудностей.

Вторая таблица содежит номера рубрик и номера родителей этих рубрик. (Ну и ещё кучу всякой вспомогательной информации о каждой рубрике (что сильно захламит дамп реальной таблицы)).

Вот эту вторую таблицу и хочется превратить в древовидный массив.
Остальное тривиально.

  Ответить  
 
 автор: Guitarist   (14.07.2009 в 08:42)   письмо автору
 
   для: Eugene77   (13.07.2009 в 19:52)
 

>
CREATE TABLE tree(
>id INT,
>node INT,
>parent INT
>)


Спасибо =) вот пока будете юзать эту чушь, будете страдать подобными проблемами (описаны Вами в первом посте). Есть нормальная форма и в ней деревьям места нет.

>Это будет быстрее, чем обращение к базе?

конечно нет =)

  Ответить  
 
 автор: Саня   (13.07.2009 в 21:52)   письмо автору
 
   для: Guitarist   (13.07.2009 в 06:08)
 

> как Вы умудрились запихнуть древовидную структуру в одну таблицу???
Про nested sets слышали?

  Ответить  
 
 автор: Eugene77   (14.07.2009 в 21:01)   письмо автору
 
   для: Саня   (13.07.2009 в 21:52)
 

>> как Вы умудрились запихнуть древовидную структуру в одну таблицу???
>Про nested sets слышали?

Да, я читал, но мне показалось, что при такой избыточности данных легко однажды вообще оказаться со сломанной таблицей. И долго-долго искать в где же там структура нарушилась?!

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

  Ответить  
 
 автор: sdasdas хаха   (13.07.2009 в 22:13)
 
   для: Guitarist   (13.07.2009 в 06:08)
 

Guitarist вообще лох)

  Ответить  
 
 автор: Guitarist   (14.07.2009 в 08:48)   письмо автору
 
   для: sdasdas хаха   (13.07.2009 в 22:13)
 

Надо же, даже зарегался специально =) ничего поумнее не мог придумать? =D

  Ответить  
 
 автор: Akdmeh   (23.07.2009 в 11:40)   письмо автору
 
   для: Eugene77   (12.07.2009 в 14:30)
 

А не можно ли попытаться сжать многомерный массив в серию?
То есть, при начале работы кода разсериализировать, а при окончании - сериализировать и заносить в базу?
http://php.su/functions/?serialize

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования