When dealing with $row in the foreach loop you aren't dealing with the same variable that is in the array, but a copy. If you want to make lasting changes you need to use a reference.
function addLength($toAdd, $added){
$result = $toAdd;
foreach ($result as & $row) {
foreach ($added as $key => $value) {
if($key == $row['id'] ){
$row['length'] = $value;
}
}
}
var_dump($result);
return $result;
}
Please make sure to note that a reference will still exist after the foreach loop has completed. It will contain a reference to the last element of your $result array. To stop this you would need to manually unset the reference.
function addLength($toAdd, $added){
$result = $toAdd;
foreach ($result as & $row) {
foreach ($added as $key => $value) {
if($key == $row['id'] ){
$row['length'] = $value;
}
}
}
var_dump($row); // Outputs the last element of your $result array
unset($row);
var_dump($row); // Now undefined.
var_dump($result);
return $result;
}
Just as an FYI, you can optimise your code and get rid of the second foreach loop, it's just not necessary. This would do the same:
function addLength($toAdd, $added){
$result = $toAdd;
foreach ($result as & $row) {
if ( array_key_exists($row['id'], $added) ) {
$row['length'] = $added[$row['id']];
}
}
var_dump($result);
return $result;
}
Now rather than looping through $added for every item in $toAdd you just check to see if the data is there (by checking for the array key) and if it is, use it.