php multi array создает динамически

У меня есть вопрос: как проще всего динамически создавать многомерный массив в php?

Вот статическая версия:

$tab['k1']['k2']['k3'] = 'value';

Я хотел бы избежать eval ()
Я не успешно с переменной переменной ($$)
поэтому я пытаюсь развить функцию fun с таким интерфейсом:

$tab = fun( $tab, array( 'k1', 'k2', 'k3' ), 'value' );

У тебя есть решение? Какой самый простой способ?

С уважением,
Энни

0

Решение

Есть несколько способов добиться этого, но вот тот, который использует способность PHP передавать N аргументов в функцию. Это дает вам гибкость создания массива с глубиной 3, или 2, или 7, или чего-то еще.

// pass $value as first param -- params 2 - N define the multi array
function MakeMultiArray()
{
$args = func_get_args();
$output = array();
if (count($args) == 1)
$output[] = $args[0]; // just the value
else if (count($args) > 1)
{
$output = $args[0];
// loop the args from the end to the front to make the array
for ($i = count($args)-1; $i >= 1; $i--)
{
$output = array($args[$i] => $output);
}
}
return $output;
}

Вот как это будет работать:

$array = MakeMultiArray('value', 'k1', 'k2', 'k3');

И будет производить это:

Array
(
[k1] => Array
(
[k2] => Array
(
[k3] => value
)
)
)
1

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

Следующая функция будет работать для любого количества клавиш.

function fun($keys, $value) {

// If not keys array found then return false
if (empty($keys)) return false;

// If only one key then
if (count($keys) == 1) {
$result[$keys[0]] = $value;
return $result;
}

// prepare initial array with first key
$result[array_shift($keys)] = '';

// now $keys = ['key2', 'key3']
// get last key of array
$last_key = end($keys);

foreach($keys as $key) {
$val = $key == $last_key ? $value : '';
array_walk_recursive($result, function(&$item, $k) use ($key, $val) {
$item[$key] = $val;
});
}
return $result;
}
1

Это должно работать, если $ tab всегда имеет 3 индекса:

функция func (&$ name, $ indexes, $ value)
{
$ name [$ indices [0]] [$ indices [1]] [$ indices [2]] = $ value;
};

func ($ tab, массив (‘k1’, ‘k2’, ‘k3’), ‘value’);

0
По вопросам рекламы [email protected]