Foreach Bug???

shuler

Новичок
Foreach Bug???

Добрый день.

Итак, сразу к проблеме.
Есть массив, имеющий такие данные:
PHP:
Array
(
    [12] => Array
        (
            [value] => Array
                (
                    [name] => x_66805106ce.jpg
                    [path] => /shared/temp/1094c04fec41fc63b2f532746f645f0c.jpg
                    [size] => 44726
                    [type] => image/jpeg
                    [normal] => x_66805106ce
                )

            [optionGroupBindingId] => 12
            [optionId] => 12
        )

    [16] => Array
        (
            [value] => Array
                (
                    [name] => x_61983180.jpg
                    [path] => /shared/temp/1bf77b6cdd6a880528130d7fac9f8ebe.jpg
                    [size] => 23314
                    [type] => image/jpeg
                    [normal] => x_61983180
                )

            [optionGroupBindingId] => 16
            [optionId] => 16
        )

)
Я пробегаюсь по массиву:
PHP:
if ( !empty( $this->design->options ) ) {
    foreach ( $this->design->options as $option ) {
        print_r( $option );
    }
}
Получаю:
PHP:
Array
(
    [value] => Array
        (
            [name] => x_66805106ce.jpg
            [path] => /shared/temp/7afbed2373482f7fe56c22c2b1b7dacb.jpg
            [size] => 44726
            [type] => image/jpeg
            [normal] => x_66805106ce
        )

    [optionGroupBindingId] => 12
    [optionId] => 12
)
Array
(
    [value] => Array
        (
            [name] => x_66805106ce.jpg
            [path] => /shared/temp/7afbed2373482f7fe56c22c2b1b7dacb.jpg
            [size] => 44726
            [type] => image/jpeg
            [normal] => x_66805106ce
        )

    [optionGroupBindingId] => 12
    [optionId] => 12
)
Если же немного изменить foreach следущим образом:
PHP:
if ( !empty( $this->design->options ) ) {
    foreach ( $this->design->options as &$option ) {
        print_r( $option );
    }
}
, то получаем другой результат:
PHP:
Array
(
    [value] => Array
        (
            [name] => x_66805106ce.jpg
            [path] => /shared/temp/9056c9475e78802bad8d78d288ff4951.jpg
            [size] => 44726
            [type] => image/jpeg
            [normal] => x_66805106ce
        )

    [optionGroupBindingId] => 12
    [optionId] => 12
)
Array
(
    [value] => Array
        (
            [name] => x_61983180.jpg
            [path] => /shared/temp/e98b76b865b5f67afc695d77fe437b77.jpg
            [size] => 23314
            [type] => image/jpeg
            [normal] => x_61983180
        )

    [optionGroupBindingId] => 16
    [optionId] => 16
)
Т.е. проблема в том, что в первом случае foreach "сожрал" второй элемент массива, выдав два дубликата первого.
Во втором же - все отлично...

Так вот вопрос в том, почему это произошло?
 

Wicked

Новичок
1)
Так вот вопрос в том, почему это произошло?
например, могло быть из-за того, что к моменту запуска первого варианта кода (без ссылки), переменная $option была ссылкой на $this->design->options[16]. А это могло, например, произойти при запуске второго варианта кода (со ссылкой) незадолго до того. Но, поскольку мы тут не телепаты, ...
2) с тебя минимальный самодостаточный пример скрипта в студию.
 

shuler

Новичок
Действительно, до этого был еще foreach со ссылкой.

Но почему при запуске foreach без ссылки после такого же со ссылкой он так сработал, что значение переменной осталось неизменным?
 

Wicked

Новичок
потому что тогда код этих двух форичей становится эквивалентен следующему:

PHP:
// первый foreach со ссылкой:
$option = &$this->design->options[12];
print_r($option);
$option = &$this->design->options[16];
print_r($option);

// тут $option - все еще ссылка на последний элемент массива

// и затем второй foreach без ссылки
$option = $this->design->options[12]; // поэтому тут, по сути, происходит копирование $this->design->options[12] в $this->design->options[16]
print_r($option);
$option = $this->design->options[16]; // и тут покажется массив такой же, какой был в $this->design->options[12]
print_r($option);
 

shuler

Новичок
Спасибо большое!!!
Надо читать мне про указатели, прежде чем ими пользоваться)))
 
Сверху