Foreach Bug???

  • Автор темы Автор темы shuler
  • Дата начала Дата начала

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 "сожрал" второй элемент массива, выдав два дубликата первого.
Во втором же - все отлично...

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

Но почему при запуске foreach без ссылки после такого же со ссылкой он так сработал, что значение переменной осталось неизменным?
 
потому что тогда код этих двух форичей становится эквивалентен следующему:

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);
 
Спасибо большое!!!
Надо читать мне про указатели, прежде чем ими пользоваться)))
 
Сверху