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

Форум PHP

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

 

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

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

тема: Многомерный массив преобразовать в одномерный массив
 
 автор: web777   (14.07.2010 в 14:30)   письмо автору
 
 

подскажите, каким образом перевести многомерный массив в одномерный?

сейчас массив выглядит таким как если его построили так

$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 максимум, это меню для админ панели.

  Ответить  
 
 автор: sim5   (14.07.2010 в 16:59)   письмо автору
 
   для: web777   (14.07.2010 в 14:30)
 

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

  Ответить  
 
 автор: web777   (14.07.2010 в 17:41)   письмо автору
 
   для: 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"

думаю немного яснее объяснил:)

  Ответить  
 
 автор: sim5   (14.07.2010 в 18:11)   письмо автору
 
   для: web777   (14.07.2010 в 17:41)
 

Можно конечно:
<?
$new 
= array();
foreach (
$arr as $key=>$val) {
  foreach (
$val as $k=>$v) {
    
$new[$k] = $v;
  }
}
//где $arr исходный массив

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

  Ответить  
 
 автор: web777   (14.07.2010 в 18:23)   письмо автору
 
   для: 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>

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

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