Ключи произвольной вложенности в массиве PHP

12
V
На сайте с 22.09.2006
Offline
103
1111

Доброго вам, коллеги!

Если кому надоели простые вопросы, вот посложней :)

Есть массив данных

a,b,c

a,bb,cc

aa,bb,ccc

aa,bb,cccc

и т.д., произвольного размера

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

Требуемый порядок - динамический, с произвольным количеством значений(последний элемент станет значением, остальные ключами):

0,1,2

Эталонным результатом примера служит массив:

[a]  =>    => c

=> [bb] => cc
[aa] => [bb] => ccc
=> cccc

Мне удалось решить для ограниченного количества ключей, а вот как сделать универсальный код для неограниченных размеров массивов?

$varorder=array(0,1,2);// порядок ключей, последнее - значение. Но может быть и 0,2,1 и 0,1 и 8,1,15,13 при наличии данных в массиве по этим ключам

$aDATA=array(
array('a','b','c'),
array('a','bb','cc'),
array('aa','bb','ccc'),
array('aa','bb','cccc')
); //массив данных

Foreach ($aDATA as $line) {
if (count($varorder)==1) {$aResult[] = $line[$varorder[0]];}
if (count($varorder)==2) {$aResult[$line[$varorder[0]]][] = $line[$varorder[1]];}
if (count($varorder)==3) {$aResult[$line[$varorder[0]]][$line[$varorder[1]]][] = $line[$varorder[2]];}
}

print_r($aResult);
.
siv1987
На сайте с 02.04.2009
Offline
427
#1

Я плохо понял задачу, но по моему на рекурсии это очень просто сделать. :)

V
На сайте с 22.09.2006
Offline
103
#2

siv1987, я тоже так думал, причем несколько часов. Это если в обратную сторону данные перегнать - да, легкая рекурсия.

Проблема сводится к тому, что требуется из одномерного

a,b,c,d,e

создать

[a][c][d]=e

но я не соображу как динамически добавить ключ, если входящие будут не
a,b,c,d,e
а
a,b,c,d,e,f ?

IL
На сайте с 20.04.2007
Offline
435
#3
aa,bb,ccc
aa,bb,cccc
с произвольным количеством значений(последний элемент станет значением, остальные ключами):

[aa][bb] одновременно и ccc, и cccc быть не может?

Задача некорректно поставлена..

a,b,c,d,e => abcd = 'e'

a,b,c,d,e,f => abcd = array('e'=>'f')

Одно другое перепишет.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
V
На сайте с 22.09.2006
Offline
103
#4

ivan-lev, спасибо, вроде понял, попробую закодить.

[aa][bb] это массив, в котором

0 => ccc

1 => cccc

IL
На сайте с 20.04.2007
Offline
435
#5
vantala:
[aa][bb] это массив, в котором
0 => ccc

Добавьте к результату ещё одну строчку:

aa,bb

и ещё одну

aa,bb,0
M0
На сайте с 04.02.2009
Offline
86
#6

Приводить в порядок лень, накидал по-быстрому:


<?
$aData = array(
array('a', 'b', 'c'),
array('a', 'bb', 'cc'),
array('aa', 'bb', 'ccc'),
array('aa', 'bb', 'cccc')
); //массив данных
$aDataOut = array();
foreach ($aData as $arr) {
$aDataOut = array_merge_recursive($aDataOut,rec($arr));
}

print_r($aDataOut);

function rec(&$data, $key = null) {
$data_out = array();
$data_keys = array_keys($data);
if ($key) {
if (isset($data[$key + 1]))
$data_out[$data[$key]] = rec($data, $key + 1);
else
$data_out = $data[$key];
return $data_out;
}else{
$data_out[$data[$data_keys[0]]] = rec($data, $key + 1);
}
return $data_out;
}
V
На сайте с 22.09.2006
Offline
103
#7

mozart007, спасибо огромное, работает на ура, но проходит по порядку.

Не подскажите, как к ней можно прикрутить $varorder=array(0,1,2); ?

это порядок и перечень ключей для $data, мне ведь нужно не все а выборочно в соответствии с этим массивом. Который может быть и $varorder=array(2,0); например... не могу сообразить :(

M0
На сайте с 04.02.2009
Offline
86
#8
vantala:
mozart007, спасибо огромное, работает на ура, но проходит по порядку.
Не подскажите, как к ней можно прикрутить $varorder=array(0,1,2); ?
это порядок и перечень ключей для $data, мне ведь нужно не все а выборочно в соответствии с этим массивом. Который может быть и $varorder=array(2,0); например... не могу сообразить :(

Уточните вопрос максимально подробно, сейчас я это читаю как белиберду ☝

V
На сайте с 22.09.2006
Offline
103
#9

mozart007, извиняюсь, в мыслях уже полный сумбур. Постараюсь подробно: ваш код вносит в массив все значения, которые есть в $aDATA(массив двумерный).

Мне же необходимо, чтобы с той же логикой вносились только значения вложенных массивов, ключи которых перечислены в $varorder, причем в порядке, в котором они там перечислены. Ваш вариант работает так, как будто $varorder=array(0,1,2.....);

т.е.

значение $aDATA[0][2] попадает в $aDataOut[$aDATA[0][0]][$aDATA[0][1]][]

значение $aDATA[1][2] попадает в $aDataOut[$aDATA[1][0]][$aDATA[1][1]][]

значение $aDATA[2][2] попадает в $aDataOut[$aDATA[2][0]][$aDATA[2][1]][] и т.д.

требуется сделать так, чтобы

при $varorder=array(2,0,1);

значение $aDATA[0][1] попадает в $aDataOut[$aDATA[0][2]][$aDATA[0][0]][]

значение $aDATA[1][1] попадает в $aDataOut[$aDATA[1][2]][$aDATA[1][0]][]

значение $aDATA[2][1] попадает в $aDataOut[$aDATA[2][2]][$aDATA[2][0]][] и т.д.

при $varorder=array(2,3); //в тестовых данных правда нет $aDATA[0][3] но будут :)

значение $aDATA[0][3] попадает в $aDataOut[$aDATA[0][2]][]

значение $aDATA[1][3] попадает в $aDataOut[$aDATA[1][2]][]

значение $aDATA[2][3] попадает в $aDataOut[$aDATA[2][2]][] и т.д.

$varorder может быть, например, array(2,3,5,0,16);

Эталонный результат при $varorder=array(0,1,2);

Array

(
[a] => Array
(
=> c
[bb] => cc
)

[aa] => Array
(
[bb] => Array
(
[0] => ccc
[1] => cccc
)

)

)

но если поменять $varorder=array(0,1,2); на $varorder=array(2,0,1); правильный результат будет таким:

Array

(
[c] => Array
(
[a] => Array
(
[0] => b
)

)

[cc] => Array
(
[a] => Array
(
[0] => bb
)

)

[ccc] => Array
(
[aa] => Array
(
[0] => bb
)

)

[cccc] => Array
(
[aa] => Array
(
[0] => bb
)

)

)

$varorder=array(2,0); правильный результат

Array

(
[c] => Array
(
[0] => a
)

[cc] => Array
(
[0] => a
)

[ccc] => Array
(
[0] => aa
)

[cccc] => Array
(
[0] => aa
)

)
M0
На сайте с 04.02.2009
Offline
86
#10

Читали про бритву Оккама?😂

Не плодиде сущностей, сначала ваши маасивы отсортируйте согласно нужной вам последовательности, а потом моим способом приводите к нужному массиву :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий