CakePHP 1.2.6 / PHP5.2.12 Ошибка в цикле массива при присвоении по ссылке

Я работаю над получением стека данных, и по какой-то причине некоторые данные повреждаются. Например, у меня есть несколько моделей сообщений, каждая из которых связана с моделями комментариев (hasMany), и каждая из моделей комментариев принадлежит пользователю. При извлечении данных вот что я получаю из базы данных для комментариев:

[Post] => Array
(
)

[Comments] => Array
(
    [0] => Array
        (
            [content] => "2010 has definitely been a busy year!"
            [created] => 2010-02-10 13:47:15
            [user_id] => 18
            [post_id] => 1
            [User] => Array
                (
                    [id] => U8
                    [username] => Uace
                    [first_name] => Uace
                )

            [_explicitType] => Comment
        )

    [0] => Array
        (
            [content] => "I can't wait..."
            [created] => 2009-12-10 13:57:36
            [user_id] => 18
            [post_id] => 1
            [User] => Array
                (
                    [id] => U8
                    [username] => Uace
                    [first_name] => Uace
                )

            [_explicitType] => Comment
        )

)

Первый символ каждого из массивов Comment[i][User] был заменен заглавной U, хотя в каждом случае он должен быть разным (например, ID 18, имя пользователя Jace и т. д.).

Я проследил это до манипуляции с массивом, с которой я работал, чтобы назначить поле _explicitType для взаимодействия с Flex (спасибо, Павел Мисиор!) в функции afterFind(). Вот цикл, в котором я застрял в _explicitType:

if (is_array($results)) {
    foreach ( $results as &$item )
    {
            $item['_explicitType'] = $this->name;

    }
} else {
    $item[$this->name]['_explicitType'] = $this->name;
}

Я предполагаю, что это связано с назначением по ссылке, но я не могу понять, почему это происходит.


person Andrew Anderson    schedule 25.02.2010    source источник
comment
Кажется, что цикл FOR работает без нарушения массива, но затем он становится беспорядочным при попытке работать с массивами без числовых индексов.   -  person Andrew Anderson    schedule 26.02.2010


Ответы (2)


Это очень странно.

Установите отладку на 2 в core.php и посмотрите в журнале sql внизу страницы, возможно, вы найдете там что-то. Также просмотрите все модели (приложение, пост, пользователь, комментарий). Возможно, есть некоторые функции beforeFind(), из-за которых это происходит. Это также происходит, когда вы выполняете простой User->find()?

Кстати. как вы получаете данные здесь?

person pawelmysior    schedule 25.02.2010
comment
А, кажется, я нашел его. Я делал кое-что с afterFind(). См. измененный пост выше. - person Andrew Anderson; 26.02.2010

Думаю нашел проблему. Я переместил проверку массива внутрь foreach(), и теперь это работает правильно. Я предполагаю, что это связано с тем, что на элементах, отличных от массива, это фактически сломало вещи. Вот мой измененный цикл с регистрацией тестов:

foreach ( $results as &$item )
{
    if(is_array($item)) {
        $item['_explicitType'] = $this->name;
    } else {
        $copy = $item;
        $copy['_explicitType'] = $this->name;
        $this->log($copy, LOG_DEBUG);
    }
}

И, конечно же, он записал данные, заменив первую букву заглавной буквой U.

person Andrew Anderson    schedule 01.03.2010