Итак, у меня есть массив, который содержит следующие элементы:
$array['a']['b'][0]['c']; $array['a']['b'][1]['c']; $array['a']['d'][0]['c']['c']; $array['b']['c'];
Затем в отдельном массиве я определил путь к этим значениям:
$structure[0] = array('a','b','#','c'); $structure[1] = array('a','d','#','c','c'); $structure[2] = array('b','c');
Наконец, у меня есть массив, содержащий значения:
$values[0] = array('value0-0','value0-1'); $values[1] = array('value1-0'); $values[2] = array('value2-0');
Я пытаюсь найти простую функцию / цикл, который сможет применить значения в значениях $ к пути массива массива $, который определен в $ structure.
Конечным результатом будет:
$array['a']['b'][0]['c']='value0-0'; $array['a']['b'][1]['c']='value0-1'; $array['a']['d'][0]['c']['c']='value1-0'; $array['b']['c']='value2-0';
В случае $ values [0] или $ values [1] он сможет прокручивать каждое значение и подставлять элемент $ struct, соответствующий «#», с номером итерации для этого конкретного значения $.
Это просто случай сжимания и записи вытянутой рекурсивной функции, или есть умная конструкция или функция php, которые могли бы обеспечить более элегантное решение?
РЕШЕНИЕ:
Благодаря Марио мое возможное решение:
foreach ($struct as $i=>$keys) foreach ($values[$i] as $val) { $r = & $array; foreach ($keys as $key) { if ($key == "#") { $key = $i; } $r = & $r[$key]; // move pointer to subarray } $r = $val; } }
Вам нужно будет работать со ссылками для перемещения целевого массива:
function inject($array, $struct, $values) { foreach ($struct as $i=>$keys) foreach ($values[$i] as $val) { $r = & $array; foreach ($keys as $key) { if ($key == "#") { $key = count($r); } settype($r[$key], "array"); $r = & $r[$key]; // move pointer to subarray } $r = $val; }