How does a reference variable work in this case? Modifying it works when it’s passed one way. I couldn’t explain it better other than showing you the code.
//this is the haystack and the array to be modified
$data = array(
'one_1' => array('value' => ''),
'one_2' => array('value' => ''),
'one_3' => array('value' => '')
);
// index to search for
$needle = 'one_2';
// value to assign to
$value = 'awesome';
// start haystack modification
modify_arr($data, $needle, $value);
// this function forms the reference to the needle in the haystack e.g $data['one_2']
function modify_arr(&$ref, $index, $value) {
$res = $ref;
foreach ($ref as $key => $arr) {
if(is_array($arr))
$res[$key] = modify_arr($arr, $index, $value);
if ($key == $index)
write_values($ref, $key, $value);
}
// assign back the modified copy of $ref
$ref = $res;
return
}
function write_values(&$ref, $key, $value) {
if (empty($ref[$key]['value']) || !$ref[$key]['value']) {
// assign the value when value is empty
$ref[$key]['value'] = $value;
} else {
// if it's not empty, increment the needle's suffix to form a new needle and assign to it instead
// result would be: from "one_1" to "one_2"
$key_parts = split_key($key);
$new_key = $key_parts[0] . '_' . ((int)$key_parts[1] + 1); // result is "one_2"
return modify_arr($ref, $new_key, $value);
}
return;
}
It works when “one_2” is empty, but when it’s not it doesn’t…
You should really, really, really take a look at
array_walk_recursive()!