Создание многомерного массива в PHP с неопределенной глубиной

Добрый вечер — я пытаюсь создать многомерный массив, основанный на разобранной текстовой строке кодов счетов, хранящихся в базе данных. Учетные коды будут различной длины / глубины. Например, $ test в приведенном ниже массиве похож на результаты, которые я бы извлек из базы данных:

$test = array(
'110|5100|120'    => 'Teacher Salaries',
'110|5100|130'    => 'Other Professoinal Services',
'110|5100|510|1'  => 'Primary Supplies',
'110|5100|510|2'  => 'Intermediate Supplies',
'110|7300|110'    => 'Administrator Salaries',
'110|7300|510'    => 'Administrative Supplies',
'763|5100'        => 'Academic Grants'
);
foreach($test AS $k => $v) {
$lvl = explode("|", $k);
// Not sure what to do next...
}

Я хочу создать функцию, которая будет возвращать массив, например:

[110] => Array
(
[5100] => Array
(
[120] => Teacher Salaries
[130] => Other Professional Services
[510] => Array
(
[1] => Primary Supplies
[2] => Intermediate Supplies
)
)
[7300] => Array
(
[110] => Administrator Salaries
[510] => Supplies
)
)
[763] => Array
(
[5100] => Academic Grants
)

Мне удалось придумать функцию, которая может взять один из кодов и правильно разбить его на массив, но когда я пытаюсь объединить их вместе, они теряют свои ключи. Вот что у меня так далеко:

function expandedArray($codes, $value) {
$decoded = explode("|",$codes);
RETURN expandedArraySub($decoded, $value);
}
function expandedArraySub($decoded = array(), $value = Null) {
$k = array_pop($decoded);
$out[$k] = $value;
if(is_array($decoded) && count($decoded) > 0) { $out = expandedArraySub($decoded, $out); }
RETURN $out;
}

Но когда я запускаю следующее, вместо того, чтобы получить то, что я хочу, как описано выше, я получаю массив, который теряет ключ «110»:

$r1 = expandedArray('110|5100|510|1', "Primary Supplies");
// $r1 is now [ 110 => [5100 => [510 => [ 1 ] ] ] ]
$r2 = expandedArray('110|5100|510|2', 'Intermediate Supplies');
// $r2 is now [ 110 => [5100 => [510 => [ 2 ] ] ] ]
$r = array_merge($r1, $r2);

Результаты, которые я получаю, удаляют первый ключ и не объединяют результаты, как я надеялся. Вот что я получаю:

[0] => Array
(
[5100] => Array
(
[510] => Array
(
[1] => Primary Supplies
)
)
)
[1] => Array
(
[5100] => Array
(
[510] => Array
(
[2] => Intermediate Supplies
)
)
)

Любая помощь высоко ценится! Спасибо!

4

Решение

Попробуйте этот код:

function getVal($data,$chain){
$level = $data;
for($i=0;$i<count($chain);$i++){
if(isset($level[$chain[$i]]))
$level = $level[$chain[$i]];
else
return null; // key does not exist, return null
}
return $level;
}

function setVal(&$data,$chain,$value){
$level = &$data;
for($i=0;$i<count($chain);$i++){
$level = &$level[$chain[$i]]; // set reference (&) in order to change the value of the object
}
$level = $value;
}

Для настройки используйте это так:

$output = array();
$test = array(
'110|5100|120'    => 'Teacher Salaries',
'110|5100|130'    => 'Other Professoinal Services',
'110|5100|510|1'  => 'Primary Supplies',
'110|5100|510|2'  => 'Intermediate Supplies',
'110|7300|110'    => 'Administrator Salaries',
'110|7300|510'    => 'Administrative Supplies',
'763|5100'        => 'Academic Grants'
);
foreach($test AS $k => $v) {
$lvl = explode("|", $k);
setVal($output,$lvl,$v);
}

$output должен иметь желаемый формат.

Подробнее об этом коде читайте в мой предыдущий пост

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector