Из документации foreach :
Если на массив не ссылаются, foreach работает с копией
указанный массив, а не сам массив. foreach имеет какую-то сторону
влияние на указатель массива. Не полагайтесь на указатель массива во время
или после foreach без сброса.
Это означает, что ваша переменная $ person является копией того, что было в массиве, по сути аналогично этому коду (обратите внимание, что этот код предназначен только для понимания и неверен на многих уровнях, в действительности вы должны использовать сброс (), current () и next () - функция для правильного зацикливания массива, см. здесь ):
for ($i = 0; $i < count($people); $i++) {
$person = $people[$i];
// code inside your foreach ...
}
Поэтому, если вы измените содержимое $ person, вы на самом деле не измените содержимое массива $ people
Чтобы решить эту проблему, вы можете использовать ссылку foreach:
foreach ($people as &$person) { // note the &
$person = $calculated_visit_value; // $person is now a reference to the original value inside $people and thus this will work as intended
}
Обратите внимание, что refence не очищается, когда цикл foreach заканчивается, поэтому в конце его $ person по-прежнему ссылается на последний элемент $ people.
Если вы не знаете, что такое ссылки, пожалуйста, обратитесь к документации для получения дополнительной информации.
Или используйте ключ для доступа к исходному массиву:
foreach ($people as $person_index => $person) {
$people[$person_index] = $calculated_visit_value;
}
Для вашей информации, вы можете использовать оба вместе
foreach ($people as $person_index => &$person { ...