php java foreach_深入解析PHP中foreach语句控制数组循环

深入解析PHP中foreach语句控制数组循环

opline->result.u.opline_num = get_temporary_variable(CG(active_op_array));

key_node = opline->result;

zend_do_assign(&dummy, key, &key_node TSRMLS_CC);

zend_do_free(&dummy TSRMLS_CC);

}

do_begin_loop(TSRMLS_C);

INC_BPC(CG(active_op_array));

}

void zend_do_foreach_end(znode *foreach_token, znode *as_token TSRMLS_DC)

{

zend_op *container_ptr;

zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); //生成JMP opcode

opline->opcode = ZEND_JMP;

opline->op1.u.opline_num = as_token->u.opline_num; //设置JMP到FE_FETCH opline行

SET_UNUSED(opline->op1);

SET_UNUSED(opline->op2);

CG(active_op_array)->opcodes[foreach_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); //设置跳出循环的opline行

CG(active_op_array)->opcodes[as_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array)); //同上

do_end_loop(as_token->u.opline_num, 1 TSRMLS_CC); //为循环嵌套而设置

zend_stack_top(&CG(foreach_copy_stack), (void **) &container_ptr);

generate_free_foreach_copy(container_ptr TSRMLS_CC);

zend_stack_del_top(&CG(foreach_copy_stack));

DEC_BPC(CG(active_op_array)); //为PHP interactive模式而设置

}

同时还要注意的是,foreach在使用中是值还是传引用的问题。

php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。先看下面的例子:

$arr = array(

array('id' => 1, 'name' => 'name1'),

array('id' => 2, 'name' => 'name2'),

);

foreach ($arr as $obj) {

$obj['id'] = $obj['id'];

$obj['name'] = $obj['name'] . '-modify';

}

print_r($arr); //输出的结果

Array(

[0] => Array (

[id] => 1

[name] => name1

)

[1] => Array(

[id] => 2

[name] => name2

)

)

观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:

foreach ($arr as &$obj) {

$obj['id'] = $obj['id'];

$obj['name'] = $obj['name'] . '-modify';

}

再看另外一个例子,array里面存放的是object,

$arr = array(

(object)(array('id' => 1, 'name' => 'name1')),

(object)(array('id' => 2, 'name' => 'name2')),

);

foreach ($arr as $obj) {

$obj->name = $obj->name . '-modify';

}

print_r($arr); //输出的结果

Array

(

[0] => stdClass Object

(

[id] => 1

[name] => name1-modify

)

[1] => stdClass Object

(

[id] => 2

[name] => name2-modify

)

)

此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值

综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。

【深入解析PHP中foreach语句控制数组循环】相关文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值