Что делает этот цикл PHP foreach? (Что делать с созданием ссылок на каждый элемент в массиве?)

Недавно я пытался создать копию массива PHP, за исключением того, что вместо копии массива, содержащей значения, я хотел, чтобы копия содержала ссылки на значения.
Моей основной мотивацией для этого было использовать call_user_func_array функция в сочетании с mysqli_stmt_bind_param а также mysqli_stmt_bind_result функции для создания функции-оболочки для обработки подготовленных операторов.

Пытаясь понять, как это сделать, я наткнулся на следующий код:

$arr = array(1, 2, 3, 4); // The array to make a copy of with references
$ref_arr = array();       // The new array that will contain the references

foreach ($arr as $key => &$val) {
  $ref_arr[$key] = &$val;
}

Приведенный выше код на самом деле дает мне то, что я хочу, создав второй массив, идентичный первому, за исключением того, что элементы в массиве являются ссылками на значения, а не на сами значения, однако я не понимаю, как это работает.

Я понимаю что такое амперсанд (&) делает в PHP, но я не понимаю, почему оба экземпляра $val в цикле foreach следует ссылаться как &$val,

Если бы кто-нибудь мог объяснить, что именно происходит в цикле foreach выше, я был бы очень признателен.
Большое спасибо.

2 ответа

Решение

Первый экземпляр должен быть справочным. В противном случае вы получите только локальную копию. Рассмотрим этот код:

$arr = array(1, 2, 3, 4); 
foreach ($arr as $val)
    $val = 5;
print_r($arr);

Этот код будет по-прежнему печатать 1,2,3,4, поскольку вы не изменяете значения в массиве, а копируете.

Та же логика применяется для второго экземпляра. Без & это только назначило бы текущее значение элемента.

mysqli_stmt_bind_param() требует, чтобы значения передавались по ссылке. Таким образом, все, что делает эта функция, это создает массив, который ссылается на значения в исходном массиве. Что делает mysqli_stmt_bind_param счастливый. Это немного глупо, но это то, что мы должны сделать, чтобы позвонить call_user_func_array() с mysqli_stmt_bind_param(),

Ссылка: см. Руководство по mysqli_stmt_bind_param()

Будьте осторожны при использовании mysqli_stmt_bind_param() в сочетании с call_user_func_array(). Обратите внимание, что mysqli_stmt_bind_param() требует, чтобы параметры передавались по ссылке, тогда как call_user_func_array () может принимать в качестве параметра список переменных, которые могут представлять ссылки или значения.

Другие вопросы по тегам