|
|
|
| Для работы программы требуется большой массив.
Вытаскиваю из базы таблицу целиком, и преобразую её в сложный массив, но получается очень уж долго.
Может быть есть более быстрый способ создания массива из какого-нибудь заранее сделанного дампа или ещё каким-нибудь способом? | |
|
|
|
|
|
|
|
для: Eugene77
(12.07.2009 в 14:30)
| | Больше чем уверен всё что Вы пытаетесь сделать с массивом на РНР, можно сделать с базой средствами СУБД (если нельзя, то значит неправильно организована база) а не вытаскивать таблицу целиком и "шаманить". | |
|
|
|
|
|
|
|
для: Valick
(12.07.2009 в 14:36)
| | Данные имеют древовидную структуру.
Структура массива соответствует структуре данных, а то, что я могу получить в качестве результирующего набора - таблица.
Так что "шаманство" неизбежно.
Отсюда и та сложность, что подгружать данные частями (по мере надобности) невозможно. | |
|
|
|
|
|
|
|
для: Eugene77
(12.07.2009 в 14:30)
| | Если после получения сложного массива вы продолжаете работу с ним, т.е. выводите некоторые его элементы, то получение сложного массива в этом случае нецелесообразно. Выбирать из базы нужно ровно столько данных, сколько требуется для отображения конкретной страницы. | |
|
|
|
|
|
|
|
для: Eugene77
(12.07.2009 в 14:30)
| | А можно мне у Вас тут поумничать?! =)))
Eugene77, Мне очень интересно, как Вы умудрились запихнуть древовидную структуру в одну таблицу??? Поделитесь опытом плиз =) Полностью согласен с Valick, нужно базу перепроектировать под Ваши задачи, ну или страдать геморроем типа сериализации кусков массива и прочим =) | |
|
|
|
|
|
|
|
для: Guitarist
(13.07.2009 в 06:08)
| | >А можно мне у Вас тут поумничать?! =)))
>Eugene77, Мне очень интересно, как Вы умудрились запихнуть древовидную структуру в одну таблицу??? Поделитесь опытом плиз =)
Дурное дело не хитое:
CREATE TABLE tree(
id INT,
node INT,
parent INT
)
|
Полностью согласен с Valick, нужно базу перепроектировать под Ваши задачи,
Будьте добры, посоветуйте как перепроектировать базу!
ну или страдать геморроем типа сериализации кусков массива и прочим =)
Это будет быстрее, чем обращение к базе? | |
|
|
|
|
|
|
|
для: Eugene77
(13.07.2009 в 19:52)
| | > Будьте добры, посоветуйте как перепроектировать базу!
Опишите задачу подробнее. А то объяснение "из базы в массив" очень куцо. | |
|
|
|
|
|
|
|
для: Саня
(13.07.2009 в 21:55)
| | Задача:
Быстро и целиком вносить в PHP дерево данных | |
|
|
|
|
|
|
|
для: Eugene77
(14.07.2009 в 21:07)
| | > но получается очень уж долго.
Долго это сколько? Покажите скрипт. А данные в память целиком вмещаются? Это должно работать при каждом посещении пользователей или время от времени запускается админом? Как часто предполагается изменение данных в таблице?
CREATE TABLE tree(
id INT,
node INT,
parent INT
)
| Это полная схема таблицы или вы опустили некоторые поля? Покажите полную схему. Можете затереть имена полей, мне интересны лишь их типы. | |
|
|
|
|
|
|
|
для: Eugene77
(14.07.2009 в 21:07)
| | Чем Вас не устроил код, который я предложил (01.07.2009 в 21:26) ?
Неужели долго выполняется? | |
|
|
|
|
|
|
|
для: 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];
}
|
Нет, конечно, выполняется он быстро.
Но он не создаёт древовидного массива.
Под древовидным массивом я подразумеваю в данном случае такую структуру, в которой ключи массива обозначают только рубрики не имеющие родителей. Значение элемента массива - это в свою очередь массив ключи которого - это только те рубрики, родителем которых является ключ предыдущей рубрики. | |
|
|
|
|
|
|
|
для: Eugene77
(16.07.2009 в 19:25)
| | пример?
Таблица из двух столбцов id, id_parent и древовидный массив ей соответствующий? | |
|
|
|
|
|
|
|
для: Trianon
(16.07.2009 в 20:04)
| | Он, видимо, хочет рекурсию. | |
|
|
|
|
|
|
|
для: Саня
(17.07.2009 в 12:26)
| | рекурсию можно вести и по предложенному массиву, и "по древовидному" и по таблице БД и по файлу. :))
Eugene77 хочет странного. Но имеет право, лишь бы четко формулировал желания. | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 12:55)
| | array(
"растения" => array(
"деревья" => array("дубы", "клёны" ,"каштаны"),
"кустарники" => array(
"садовые" => array(
"декоративные" => array("самшит"),
"плодовые" => array("жимолость")
),
"дикие" => array("дереза")
)
); | |
|
|
|
|
|
|
|
для: Trianon
(17.07.2009 в 12:55)
| |
<?
array(
"растения" => array(
"деревья" => array("дубы", "клёны" ,"каштаны"),
"кустарники" => array(
"садовые" => array(
"декоративные" => array("самшит"),
"плодовые" => array("жимолость")
),
"дикие" => array("дереза")
)
);
|
| |
|
|
|
|
|
|
|
для: Eugene77
(21.07.2009 в 21:01)
| | Массив Вы привели. Кривой, правда.
А таблицу - нет. | |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 00:30)
| |
<?
array(
"растения" => array(
"деревья" => array("дубы", "клёны" ,"каштаны"),
"кустарники" => array(
"садовые" => array(
"декоративные" => array("самшит"),
"плодовые" => array("жимолость")
),
"дикие" => array("дереза")
)
);
растения -> деревья,
растения -> кустарники,
деревья -> дубы,
деревья -> клёны,
деревья -> каштаны,
кустарники -> садовые,
кустарники -> дикие,
садовые -> декоративные,
садовые -> плодовые,
декоративные -> самшит,
плодовые -> жимолость,
дикие -> дереза,
|
| |
|
|
|
|
|
|
|
для: Trianon
(22.07.2009 в 00:30)
| | Я, кстати, привёл не только массив и описал структуру таблицы(см. выше), но и в той теме, на которую вы ссылаетесь, привёл решение этой задачи.
Вопрос стоит в оптимизации решения.
Почему-то у меня не получается сделать его на основе передачи ссылок на элементы массива.
Поэтому получатся при рекурсивных вызовах большие куски массива приходится тащить через стек.
В общем чего-то я никак не могу уловить в РНР в отношении работы со ссылками.
Очень хотелось бы посмотреть как нормально грамотно написать такую функцию! | |
|
|
|
|
|
|
|
для: Eugene77
(23.07.2009 в 09:56)
| | Я спрашивал не про структуру (структуру Вы действительно привели), а про данные таблицы.
Почему я назвал массив кривым?
Потому что терминальные элементы (листья) в нем описаны не так, как порождающие.
Это не есть правильно, хотя бы потому, что нарушает ортогональность и привносит ненужные усложнения в код.
ортогональный массив выглядел бы так:
<?
array(
"растения" => array(
"деревья" => array("дубы" => array(), "клёны"=> array() ,"каштаны"=> array()),
"кустарники" => array(
"садовые" => array(
"декоративные" => array("самшит"=> array()),
"плодовые" => array("жимолость"=> array())
),
"дикие" => array("дереза"=> array())
)
);
|
Моему варианту массива соответствует одна таблица БД
Вашему, как правило, две разные. | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2009 в 11:17)
| | Да, извините, именно такой массив мой скрипт и создаёт. | |
|
|
|
|
|
|
|
для: Eugene77
(23.07.2009 в 12:24)
| | дамп данных приведете? | |
|
|
|
|
|
|
|
для: Eugene77
(23.07.2009 в 12:24)
| | Именно какой? | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2009 в 12:28)
| | >Именно какой?
Да.
Мне кажется, что вы напрасно задаёте так много уточняющих вопросов:
Если вы знаете другую более удобную неизбыточную структуру таблицы для хранения данных древовидной структуры, то давно бы её привели.
Если ВЫ такой таблицы не знаете, то почему возникают сомнения что мы говорим о разном?
Если предположить, что я не догадался до этой структуры, то я "догадаюсь" о ней по вашему ответу. | |
|
|
|
|
|
|
|
для: 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) где внезапно оказываются две таблицы.
Идите-ка Вы в жопу.... | |
|
|
|
|
|
|
|
для: Trianon
(24.07.2009 в 09:56)
| | Из всего этого ясно, что меня интересует любой разумный метод работы с иерархией,
а вы либо не знаете, либо не хотите предложить ни одного.
(Я не говорю о избыточных структурах таблиц. Тут ссылку на них уже давали.)
В принципе, я и предполагал, что этим дело закончится. | |
|
|
|
|
|
|
|
для: Eugene77
(24.07.2009 в 10:04)
| | Из всего этого ясно другое. А именно, что Вас что-то интересует, но Вы не пытаетесь приложить даже минимума усилий, чтобы понятно объяснить, что именно.
Этот подход ("а чо думать-то? Спрошу - а там разберутся") виден во всех ваших постах.
И поэтому, не смотря на Ваш достаточно высокий , по сравнению с местным большинством, уровень, учить Вас чему-либо не тянет никогда. | |
|
|
|
|
|
|
|
для: Eugene77
(24.07.2009 в 09:28)
| | Вы задали базовый вопрос- как таблицу перегнать в массив. Быстро и аккуратно.
Я удивился вопросу (вроде не Ваш уровень) , но показал - как.
Вместо того, чтобы , как Вы пишете, догадаться, Вы стали юлить и сетовать на то, де, что вот массив нужен не такой, а другой.
Теперь Вы пишете, что Вас оказывается не создание массива интересует, а выбор структуры таблицы, хотя их всего-то раз, два и три. И все детально описаны.
Вы смерти моей хотите чтоли? | |
|
|
|
|
|
|
|
для: Trianon
(24.07.2009 в 10:08)
| | >Вы задали базовый вопрос- как таблицу перегнать в массив. Быстро и аккуратно.
>Я удивился вопросу (вроде не Ваш уровень) , но показал - как.
>Вместо того, чтобы , как Вы пишете, догадаться, Вы стали юлить и сетовать на то, де, что вот массив нужен не такой, а другой.
Меня самого удивило, что то что вы предложили вы считаете древовидной структурой массива (речь идёт о теме на которую вы ссылались).
>Теперь Вы пишете, что Вас оказывается не создание массива интересует, а выбор структуры таблицы, хотя их всего-то раз, два и три. И все детально описаны.
Про выбор структуры таблицы я создавал отдельную тему, но так ничего и не взял из неё.
Ну, и остановился на самом простом. Именно поэтому я сделал вывод, что со структурой таблицы разночтений не будет и именно поэтому считаю ваши уточняющие вопросы пустыми.
>Вы смерти моей хотите чтоли?
Я не могу ещё более конкретизировать вопрос имея перед собой свою задачу.
Какой мне нужен массив? Да любой, но чтобы его можно было обходить ветку за веткой. Только и всего. А какая структура в РНР этому соответствует? Вы много знаете? Я - только одну, если не считать отличия в концах веточек, которые вы назвали ортогональностью. Но любые отличия на кончиках массива для меня значения не имеют. Да и вообще для практики их значение будет минимально. Так что мне кажется, что несмотря на краткость формулировки, задача вполне определена (мы говорим о теме, на которую вы сослались). То есть любое решение, предложенное с вашей стороны, удовлетворит мой интерес.
Тут два варинта: либо вы не хотите это замечать упираясь в "педагогические соображения",
либо я что-то глубоко не понимаю в древовидной структуре. Ну, тогда - поясните, какие тут могут быть ещё варианты, мною не замеченные. | |
|
|
|
|
|
|
|
для: 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, 'Дубы'),
| (и т.д.) ?!
Я вот в упор не понимаю, почему это должен делать я, в то время, когда потребность в знаниях испытываете Вы! | |
|
|
|
|
|
|
|
для: 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, 'Малина домашняя')
|
>
>Я вот в упор не понимаю, почему это должен делать я, в то время, когда потребность в знаниях испытываете Вы!
Ну, это да. Если нарисовать - это сэкономит минутку вашего времени. Буду приводить образец готового дампа.
Теперь вопрос, получается, потерял практическое значение для меня.
Но осталось желание посмотреть образец качественно написанного кода.
Возможно ли создать именно древовидный массив без такого громоздкого кода как сочинил я? Мне бы очень хотелось взглянуть как вы там будете передавать ссылки!
Спасибо за во многом справедливую критику! | |
|
|
|
|
|
|
|
для: 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, $tree, 1);
?>
|
<?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, $tree, 1); unset($list); unset($tree);
echo "<pre>"; print_r($arr); echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(25.07.2009 в 10:56)
| | Спасибо!
Сейчас буду разбираться. | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2009 в 11:17)
| | Да, две разные.
Но проблема, как вы понимаете, только с одной. | |
|
|
|
|
|
|
|
для: Eugene77
(23.07.2009 в 12:26)
| | >Да, две разные.
ну и как вас понимать после этого? | |
|
|
|
|
|
|
|
для: Trianon
(23.07.2009 в 12:27)
| | Одна таблица содержит "листья" со ссылками к какой веточке они крепятся (могут крепиться к любой). С этой таблицей нет никаких трудностей.
Вторая таблица содежит номера рубрик и номера родителей этих рубрик. (Ну и ещё кучу всякой вспомогательной информации о каждой рубрике (что сильно захламит дамп реальной таблицы)).
Вот эту вторую таблицу и хочется превратить в древовидный массив.
Остальное тривиально. | |
|
|
|
|
|
|
|
для: Eugene77
(13.07.2009 в 19:52)
| | >
CREATE TABLE tree(
>id INT,
>node INT,
>parent INT
>)
|
Спасибо =) вот пока будете юзать эту чушь, будете страдать подобными проблемами (описаны Вами в первом посте). Есть нормальная форма и в ней деревьям места нет.
>Это будет быстрее, чем обращение к базе?
конечно нет =) | |
|
|
|
|
|
|
|
для: Guitarist
(13.07.2009 в 06:08)
| | > как Вы умудрились запихнуть древовидную структуру в одну таблицу???
Про nested sets слышали? | |
|
|
|
|
|
|
|
для: Саня
(13.07.2009 в 21:52)
| | >> как Вы умудрились запихнуть древовидную структуру в одну таблицу???
>Про nested sets слышали?
Да, я читал, но мне показалось, что при такой избыточности данных легко однажды вообще оказаться со сломанной таблицей. И долго-долго искать в где же там структура нарушилась?!
Я не то чтобы совсем против такого подхода, но мне всё равно вся таблица нужна. Поэтому в моём случае (когда не стоит задачи выборки отдельной ветки итп), преимущества не вижу. | |
|
|
|
|
автор: sdasdas хаха (13.07.2009 в 22:13) |
|
|
для: Guitarist
(13.07.2009 в 06:08)
| | Guitarist вообще лох) | |
|
|
|
|
|
|
|
для: sdasdas хаха
(13.07.2009 в 22:13)
| | Надо же, даже зарегался специально =) ничего поумнее не мог придумать? =D | |
|
|
|
|
|
|
|
для: Eugene77
(12.07.2009 в 14:30)
| | А не можно ли попытаться сжать многомерный массив в серию?
То есть, при начале работы кода разсериализировать, а при окончании - сериализировать и заносить в базу?
http://php.su/functions/?serialize | |
|
|
|
|