The question is very similar to that: Pre-program parameters to be removed from an object
The difference is that in the other question the problem is to get access and the most complicated is that it was an object and not an array.
In PHP, there is the function array_reduce() for that purpose, but for your case, what complicates it is that you need to set and not just read.
So using a logic very similar to the one I posted in the other question, I made 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);
If possible, provide the code you already have ready, this helps in debugging.
– Brumazzi DB