Foreach循环的奇怪行为

时间:2012-07-02 15:03:24

标签: php loops foreach

我遇到了以下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']的内容不会改变我无法正确打印的事实。

2 个答案:

答案 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次。