Что делает этот цикл 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 () может принимать в качестве параметра список переменных, которые могут представлять ссылки или значения.