|
|
|
| подскажите, каким образом перевести многомерный массив в одномерный?
сейчас массив выглядит таким как если его построили так
$query = 'SELECT `id`,`parent`,`name` FROM `menu`';
$result = mysql_query($query);
$arr=null;
while ($row = mysql_fetch_assoc($result))
{
$arr[$row['parent']][] = array ('id'=>$row['id'],'parent'=>$row['parent'],'name'=>$row['name'],'url'=>$row['url']);
}
|
сам запрос написал в ручную без проверки, но думаю смысл должен быть понятен как должен выглядеть массив. Нужно массив преобразовать в такой как если бы его сформировали так
$query = 'SELECT `id`,`parent`,`name` FROM `menu`';
$result = mysql_query($query);
$arr=null;
while ($row = mysql_fetch_assoc($result))
{
$arr[$row['id']] = array ('id'=>$row['id'],'parent'=>$row['parent'],'name'=>$row['name'],'url'=>$row['url']);
}
|
запросы привёл для простоты, на самом же деле у меня массив располагается в отдельном файле ввиде первого варианта, редактируется он в ручную., элементов не так уж и много, около 150 максимум, это меню для админ панели. | |
|
|
|
|
|
|
|
для: web777
(14.07.2010 в 14:30)
| | Вы считате, что во втором случае получите одномерный массив? И зачем в ключ помещать массив, в котором есть ключ со значением равным ключу родителя?
Если поместить это все действительно в одномерный массив, то вы лишитесь записей, ибо одномерный массив не может содержать одинаковых ключей. | |
|
|
|
|
|
|
|
для: sim5
(14.07.2010 в 16:59)
| | да, немного не верно выразился, сейчас покажу ввиде массива, сейчас массив выглядит примерно таким образом:
array
(
'0' => array
(
'modules' => array
(
'id' => 'modules'
'parent' => '0'
'name' => 'Модули'
'url' => 'modules'
)
'components' => array
(
'id' => 'components'
'parent' => '0'
'name' => 'Компоненты'
'url' => 'components'
)
)
'modules' => array
(
'auto' => array
(
'id' => 'auto'
'parent' => 'modules'
'name' => 'Авто'
'url' => 'manager/auto'
)
'news' => array
(
'id' => 'news'
'parent' => 'modules'
'name' => 'Новости'
'url' => 'manager/news'
)
'role' => array
(
'id' => 'role'
'parent' => 'modules'
'name' => 'Роли'
'url' => 'manager/role'
)
)
'auto' => array
(
'auto_create' => array
(
'id' => 'auto_create'
'parent' => 'auto'
'name' => 'Добавить авто'
'url' => 'manager/auto/create'
)
'auto_list' => array
(
'id' => 'auto_list'
'parent' => 'auto'
'name' => 'Список авто'
'url' => 'manager/auto/list'
)
'auto_setting' => array
(
'id' => 'auto_setting'
'parent' => 'auto'
'name' => 'Настройки'
'url' => 'manager/auto/setting'
)
)
'auto_setting' => array
(
'auto_setting_email' => array
(
'id' => 'auto_setting_email'
'parent' => 'auto_setting'
'name' => 'Емайл'
'url' => 'manager/auto/setting/email'
)
)
)
|
нужно его конвертировать вот такой
'modules' => array
(
'id' => 'modules'
'parent' => '0'
'name' => 'Модули'
'url' => 'modules'
)
'components' => array
(
'id' => 'components'
'parent' => '0'
'name' => 'Компоненты'
'url' => 'components'
)
'auto' => array
(
'id' => 'auto'
'parent' => 'modules'
'name' => 'Авто'
'url' => 'manager/auto'
)
'news' => array
(
'id' => 'news'
'parent' => 'modules'
'name' => 'Новости'
'url' => 'manager/news'
)
'role' => array
(
'id' => 'role'
'parent' => 'modules'
'name' => 'Роли'
'url' => 'manager/role'
)
'auto_create' => array
(
'id' => 'auto_create'
'parent' => 'auto'
'name' => 'Добавить авто'
'url' => 'manager/auto/create'
)
'auto_list' => array
(
'id' => 'auto_list'
'parent' => 'auto'
'name' => 'Список авто'
'url' => 'manager/auto/list'
)
'auto_setting' => array
(
'id' => 'auto_setting'
'parent' => 'auto'
'name' => 'Настройки'
'url' => 'manager/auto/setting'
)
'auto_setting_email' => array
(
'id' => 'auto_setting_email'
'parent' => 'auto_setting'
'name' => 'Емайл'
'url' => 'manager/auto/setting/email'
)
|
возможно такое?
смысл в том что в первом варианте я не смогу построить навигационное меню типа
Модули -> Новости -> Добавить Новость
поэтому решил конвертировать массив так сказать в плоскую структуру(если правильно выразился) а дальше легко можно будет определить значение "id" элемента через $_SERVER['REQUEST_URI'] предварительно обработать и сделать сравнение по элементу "url", а дальше пробежаться циклом собрать всех родителей, для этого нужен элемент "parent"
думаю немного яснее объяснил:) | |
|
|
|
|
|
|
|
для: web777
(14.07.2010 в 17:41)
| | Можно конечно:
<?
$new = array();
foreach ($arr as $key=>$val) {
foreach ($val as $k=>$v) {
$new[$k] = $v;
}
}
//где $arr исходный массив
|
Но если исходный массив получается запросом из базы, может стоит подумать о структуре таблицы? Да и зачем строить промежуточный массив чтобы построить меню, опять таки, если это берется из базы. | |
|
|
|
|
|
|
|
для: sim5
(14.07.2010 в 18:11)
| | вау, здорово, то что доктор прописал, спасибо:)
с таблицей тоже удобно, но в данном случаи я решил обойтись без ниё, т.к. система модульная, и мне было бы проще пробежаться по файлам menu.php и собрать массив с каждого модуля, и сформировать в едино цело, потом всё закэшировать. А с БД, надо лишние запросы писать, делать проверку, да и в обслуживании не удобно, проще открыть файл и изменить что-то.
вот для интереса небольшой кусок из файла menu.php одного из будущего модуля
<?php
return array (
array ('id' => 'news','parent' => 'modules','name' => 'Новости', 'url' => 'manager/news'),
array ('id' => 'news_list','parent' => 'news','name' => 'Мои новости','url' => 'manager/news/list/'),
array ('id' => 'news_create','parent' => 'news','name' => 'Добавить новость','url' => 'manager/news/create'),
array ('id' => 'news_cat_create','parent' => 'news','name' => 'Добавить раздел','url' => 'manager/news/cat/create'),
array ('id' => 'news_cat_list','parent' => 'news','name' => 'Список разделов','url' => 'manager/news/cat/list'),
array ('id' => 'news_setting','parent' => 'news','name' => 'Настройки','url' => 'manager/news/setting'),
array ('id' => 'news_setting_email','parent' => 'news_setting','name' => 'Емайл','url' => 'manager/news/setting/email'),
);
|
обслуживать данный код будет только программист, поэтому сделал вручную, да и изменяться не так часто будет
насчёт промежуточного, оно тоже нужно, к примеру для создании меню ввиде дерева через рукурсию, с помощью списков <ul><li> | |
|
|
|
|