alexxxus
Есть вложенные категории в одномерных массивах,
где ключ соответствует уровню вложенности:
$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 раз(а)
johndoe2
По сути не может быть такого, что индексы в $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);
Yacc
Код:
$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]
]
]
]
*/