The question is very similar to this: Pre program parameters to remove from an object
The difference is that in the other question the problem is getting access and what made it more complicated was that it was an object, not an array.
In PHP, there is the array_reduce () function for this purpose, but for your case, what complicates is that you need to set and not just read.
So using a logic very similar to what I posted in the other question, I did a simple version for your case:
function SetArrayReduce($array, $key, $val)
{
$r = array();
$l = function($r) use (&$l, &$key, $val) {
foreach ($key as $k => $v) {
if (!isset($key[$k])) {
break;
}
unset($key[$k]);
if (count($key) < 1) {
return array($v=>$val);
}
$r[$v] = $l($r);
}
return $r;
};
if (is_string($key)) {
$key = explode(':', $key);
}
$r = $l($r);
unset($key, $val);
return array_merge_recursive($array, $r);
}
/*
O array com os dados originais.
*/
$array = array(
0 => array(
'per' => array(
'per_dep' => array(
0 => 1115921,
1 => 1705572,
2 => 1126464,
3 => 1131324
)
)
)
);
/*
A chave/índice que pretende modificar.
Exemplo, para modificar somente $array[0]['per']['per_dep']
A função SetArrayReduce() aceita uma string como parâmetro.
Apenas precisa definir um delimitador. Por padrão o delimitador é :
$key = '0:per:per_dep';
*/
$key = Array
(
0 => 0,
1 => 'per',
2 => 'per_dep'
);
/*
O array $key pode ser escrito de outras formas:
$key = array(0, 'per', 'per_dep');
$key = array('string1' => 0, 'string2' => 'per', 'string3' => 'per_dep');
O importante é que os valores devem estar na ordem correta pois serão agrupados em cascata.
*/
/*
Remova o comentário da linha abaixo e experimente o resultado usando $key como string.
*/
//$key = '0:per:per_dep';
/*
O valor que deseja atribuir a chave/índice.
*/
$val = 9999999;
/*
Invoca a função e mostra o resultado.
*/
$rs = SetArrayReduce($array, $key, $val);
print_r($rs);