В чем разница между
foreach ($my_array as $my_value) {
}
и
foreach ($my_array as &$my_value) {
}
?
Могу ли я попросить вас дать мне два реальных примера, когда их использовать, а когда вы используете другой?
В чем разница между
foreach ($my_array as $my_value) {
}
и
foreach ($my_array as &$my_value) {
}
?
Могу ли я попросить вас дать мне два реальных примера, когда их использовать, а когда вы используете другой?
В первом примере создается копия значения, а вторая использует ссылку на исходное значение. Таким образом, после первого запуска foreach
исходный массив все еще остается нетронутым. После второго foreach
исходный массив мог быть изменен, так как он обрабатывался ссылкой.
Некоторые встроенные функции PHP уже работают таким образом, как shuffle()
, который перестраивает содержимое вашего массива. Вы заметите, что эта функция не возвращает массив, вы просто называете это:
$myArray = array('foo', 'bar', 'fizz', 'buzz');
shuffle( $myArray );
// $myArray is now shuffled
И он работает своей магией, поскольку он работает с массивом по ссылке, а не создает его копию.
Тогда есть функции, которые ничего не передают по ссылке, а скорее имеют дело с копией исходного значения, например ucwords()
который возвращает новую результирующую строку:
$myString = "hello world";
$myString = ucwords( $myString );
// $myString is now capitalized
См. Передача по ссылке.
ответы Джонатана описывает это очень хорошо. Просто для полноты, вот ваши два примера:
Просто значения чтения:
$my_array = range(0,3);
foreach ($my_array as $my_value) {
echo $my_value . PHP_EOL;
}
Добавление некоторого числа в каждый элемент (таким образом, изменение каждого значения):
foreach ($my_array as &$my_value) {
$my_value += 42;
}
Если вы не используете &$my_value
, добавление не окажет никакого влияния на $my_array
.
Но вы можете написать то же самое, не используя ссылки:
foreach($my_array as $key=>$value) {
$my_array[$key] = $value + 42;
}
Отличие состоит в том, что мы обращаемся к/изменяем исходное значение непосредственно с помощью $my_array[$key]
.
Когда вы префикс переменной с амперсандом, вы создаете "ссылку". Ссылки PHP похожи на ярлыки или символические ссылки на вашем компьютере. Вы можете создать переменную указателя, которая является просто другим именем для тех же данных.
Я не вижу большой разницы в их использовании, за исключением того, что вы НЕ ДОЛЖНЫ КОПИРОВАТЬ переменную, сохраняющую память. Когда вы передаете переменные, вы можете просто передать ссылку и контрольные точки на исходный объект.
Пример реального мира и его использование - это когда вам нужно изменить содержимое массива с очень небольшим количеством строк кода
foreach($arrFeed as &$objFeed)
$objFeed['externalSrc'] = convertToLocalImage($objFeed['externalSrc']);