我遇到了以下foreach循环的一些奇怪行为。 我在PHP 5.3.0上运行它。
print_r($this->form_spec['fields']);
foreach($this->form_spec['fields'] as $f=>$field) {
print_r($this->form_spec['fields']);
}
第一个print_r打印出以下内容(注意:我排除了一堆键以使我的观点更加清晰):
Array
(
[0] => Array
(
[field_name] => d_first_name
)
[1] => Array
(
[field_name] => d_last_name
)
)
第二个print_r
打印:
Array
(
[0] => Array
(
[field_name] => d_first_name
)
[1] => Array
(
[field_name] => d_first_name
)
)
$ this-> form_spec ['fields']在到达for each循环之前已经有了它的值。第一个print_r显示正确的值。 然后第二个print_r显示值已更改。这些之间没有其他代码。
这可能是5.3.0中的错误吗?
我能解决问题的唯一方法是使用for循环,但Foreach应该工作,它总是在以前完成。有人可以开导我吗?
[编辑]只是为了澄清,错误是$ this-> form_spec ['fields']的内容不会改变我无法正确打印的事实。
答案 0 :(得分:2)
您正在打印$this->form_spec['fields']
而不是迭代$field
的结果。
修改强>
现在我可以看到你的意思了。看起来你正在改变对象的内容,同时在循环中的某个地方迭代它。您能否发布相关代码?
我99%确定迭代时会触及更多代码,这会改变你所拥有的代码。
答案 1 :(得分:1)
你应该这样做: -
print_r($this->form_spec['fields']);
foreach($this->form_spec['fields'] as $f=>$field) {
print_r($field);
}
我已在您的代码上运行此测试: -
for($i = 0; $i < 10; $i++){
$form_spec['fields'][] = array('field_name' => 'field_' . $i);
}
print_r($form_spec['fields']);
foreach($form_spec['fields'] as $f => $field) {
print_r($form_spec['fields']);
}
(PHP_VERSION = 5.3.0)
并获得了我预期的输出,因此您必须在某处更改该数组。您需要非常仔细地检查您的代码。
输出: -
Array
(
[0] => Array
(
[field_name] => field_0
)
[1] => Array
(
[field_name] => field_1
)
[2] => Array
(
[field_name] => field_2
)
[3] => Array
(
[field_name] => field_3
)
[4] => Array
(
[field_name] => field_4
)
[5] => Array
(
[field_name] => field_5
)
[6] => Array
(
[field_name] => field_6
)
[7] => Array
(
[field_name] => field_7
)
[8] => Array
(
[field_name] => field_8
)
[9] => Array
(
[field_name] => field_9
)
)
重复10次。