Реклама на сайте Advertise with us

PHP Как одномерные массивы перегнать в многомерный? [решено]

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 01.10.04
Сообщения: 456
Рейтинг: 149

Ссылка на сообщениеДобавлено: 01/02/13 в 10:01       Ответить с цитатойцитата 

Есть вложенные категории в одномерных массивах,
где ключ соответствует уровню вложенности:

$A = array (
'0' => 'porn',
'1' => 'pics',
'2' => 'gifs'
);

$B = array (
'0' => 'porn',
'1' => 'movs',
'2' => 'avi'
);


Не являюсь профи в РНР, подскажите, пожалуйста, как перегнать это
дело во вложенный массив? Может быть есть такие функции в РНР?

Должно быть такое (ключи, соответственно, должны перекрываться, в
данном случае категория porn содержит две подкатегории pics и movs):

array $С
['porn']['pics']['gifs']
['porn']['movs']['avi']


Спасибо.

Последний раз редактировалось: alexxxus (01/02/13 в 11:47), всего редактировалось 2 раз(а)

0
 



С нами с 11.10.12
Сообщения: 428
Рейтинг: 1032


Передовик Master-X (16.11.2012)
Ссылка на сообщениеДобавлено: 01/02/13 в 10:31       Ответить с цитатойцитата 

По сути не может быть такого, что индексы в $A или $B начинаются не с 0, или между индексами есть пропуски. Поэтому принудительная индексация не нужна, $A и $B - просто списки.

Код:
$A = array (
   'porn', 'pics', 'gifs'
);

$B = array (
   'porn', 'movs', 'avi'
);

function merge_into( &$C, $a){
   $p =& $C;
   foreach ($a as $v){
      if (!array_key_exists($v,$p)) $p[$v] = array();
      $p =& $p[$v];
   }
}

$C = array();
merge_into($C,$A);
merge_into($C,$B);

print_r($C);

apache, bash, css, elasticsearch, ffmpeg, html, js, mysql, mongo, nginx, php; *nix only

4
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 01/02/13 в 10:59       Ответить с цитатойцитата 

Код:
$a = [
    ['porn', 'pics',  'gifs', 1],
    ['porn', 'pics',  'jpg', 2],
    ['porn', 'pics',  'jpg', 3],
    ['porn', 'movs',  'flv', 4],
    ['porn', 'movs',  'avi', 5],
    ['not porn', 'pics',  'gifs', 6]
];

$b = [];

foreach($a as $c) {
    if( ! isset($b[$c[0]]))
        $b[$c[0]] = [];
    if( ! isset($b[$c[0]][$c[1]]))
        $b[$c[0]][$c[1]] = [];
    if( ! isset($b[$c[0]][$c[1]][$c[2]]))
        $b[$c[0]][$c[1]][$c[2]] = [];
    $b[$c[0]][$c[1]][$c[2]][] = $c[3];
}

echo '<pre>'.print_r($b, 1).'</pre>';

/*
$b = [
    'porn' => [
        'pics' => [
            'gifs' => [1]
            'jpg' => [2, 3]
        ],
        'movs' => [
            'flv' => [4]
            'avi' => [5]
        ]
    ],
    'not porn' => [
        'pics' => [
            'gifs' => [6]
        ]
    ]
]
*/

4
 



С нами с 01.10.04
Сообщения: 456
Рейтинг: 149

Ссылка на сообщениеДобавлено: 01/02/13 в 11:23       Ответить с цитатойцитата 

Класс. Огромное спасибо за помощь. Оценки максимальные выставил всем.

1
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »