This is a collection of questions that come up every now and then about syntax in PHP. This is also a Community Wiki, so everyone is invited to participate in maintaining this list.
It used to be hard to find questions about operators and other syntax tokens.¹
The main idea is to have links to existing questions on Stack Overflow, so it's easier for us to reference them, not to copy over content from …
让我通过说我知道它是什么foreach,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach".
很长一段时间,我认为这foreach与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.
让我说明我的意思.对于以下测试用例,我们将使用以下数组:
$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
foreach ($array as $item) {
echo "$item\n";
$array[] = $item;
}
print_r($array);
/* Output in loop: 1 2 3 4 5
$array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)
这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:
foreach ($array as $key => $item) {
$array[$key + 1] = $item + 2;
echo "$item\n";
}
print_r($array);
/* Output …Run Code Online (Sandbox Code Playgroud) 我有这个代码:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么输出是:零一二二.
来自zend认证学习指南.
我想知道是否可以编辑foreach循环中正在处理的当前对象
我正在使用一组对象$questions,我想通过查找与我的数据库中的问题对象相关的答案.因此,对于每个问题,请获取答案对象并更新我的循环中的当前$question 内容,foreach以便我可以在其他地方输出/处理.
foreach($questions as $question){
$question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
Run Code Online (Sandbox Code Playgroud) 在PHP中,函数参数可以通过在函数声明中的参数前加一个&符号来引用,如下所示:
function foo(&$bar)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,我知道这不是为了提高性能,而是为了允许函数更改通常超出其范围的变量.
相反,PHP似乎使用Copy On Write来避免复制对象(也可能是数组),直到它们被更改为止.因此,对于不更改其参数的函数,效果应与通过引用传递它们的效果相同.
但是,我想知道Copy On Write逻辑是否可能在传递引用时短路,以及是否会对性能产生任何影响.
ETA:可以肯定的是,我认为它并不快,而且我很清楚这不是引用的内容.所以我认为我自己的猜测非常好,我只是想找一个真正知道发生在幕后的人的回答.在PHP开发的五年中,我总是发现很难通过阅读源来获得PHP内部的高质量信息.
我有一个具有此结构的数组(这是其中一个条目):
[11] => Array
(
[id_cred] => CD000000905
[gbv_tot] => 482197.51
[ammesso] => 482197.51
[tipo] => 1
[importo] => 0
[stato] => aperta
)
Run Code Online (Sandbox Code Playgroud)
我在foreach中遍历它,根据某些条件将[importo]设置为等于[gbv_tot]或[ammesso].我写了这段代码但似乎没有更新密钥[importo]的值.
foreach($creds as $cred){
if(($cred['tipo'] == '1')&&($tipo_az == 'conc')){
//sto elaborando un chirografo in una azione concorsuale quindi prendo il nominale
if($cred['stato']=='aperta'){
$gbv_compl = $gbv_compl + $cred['ammesso'];
$cred['importo'] = $cred['ammesso'];
}else{
$cred['importo'] = 0;
}
}else{
//sto elaborando qualcosa d'altro e quindi prendo il GBV
if($cred['stato']=='aperta'){
$gbv_compl = $gbv_compl + $cred['gbv_tot'];
$cred['importo'] = $cred['gbv_tot'];
}else{
$cred['importo'] …Run Code Online (Sandbox Code Playgroud) 我正在尝试在数组中添加一个字段并返回它,但据说var_dump,没有对数组进行任何更改.执行if块中的指令,数据似乎正确.
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;
}
Run Code Online (Sandbox Code Playgroud)