2014-12-29 4 views
1

У меня возникла проблема с извлечением кода PHP из базы данных с использованием PDO, и мне было интересно, сможет ли кто-нибудь помочь мне в этом. У меня есть класс, который извлекает события из базы данных и возвращает результат в массиве.PHP array_merge заменяет существующие значения массива

Соответствующая часть кода:

$seminars = array(); 

$sql = 'select * from seminars'; 
$stmt = $this->dbconn->query($sql); 
$stmt->setFetchMode(PDO::FETCH_INTO, new SeminarEvent); 

foreach($stmt as $seminar) { 
     echo "<p>Seminar Row: ".var_dump($seminar)."</p>"; // Prints the unique row 
     $seminars[] = $seminar; 
     echo "<p>";var_dump($seminars);echo "</p>"; // Debug 
} 

(SeminarEvent класс я написал, содержащий соответствующие поля с добытчиками и сеттеров, которые были включены в заголовок)

Я читать в документах на php.net является то, что $ array [] = $ elem и array_push ($ array, $ elem) оба добавляют $ elem к END массива, поэтому я попытался использовать оба, и я получаю то же самое результат:

Часть, которая для меня проблема, заключается в добавлении $ семинара к массиву repl используя ВСЕ значения во всем массиве. Это также происходит при использовании array_merge. Результат var_dump показывает, что размер массива увеличивается на 1 (как и ожидалось), но все значения заменяются вновь вставленным элементом каждый раз, когда я добавляю элемент в массив. Я пробовал этот код на другом сервере, и получаю точно такой же результат.

Я пропустил что-то простое здесь?

EDIT: Я добавил дополнительную строку, чтобы распечатать текущий семинар $ из цикла foreach, и каждый раз каждый вывод будет отличаться, поэтому $ workshop правильно ссылается на каждую строку из инструкции, однако массив $ seminar содержащий только последний элемент, добавленный в массив.

ответ

0

Я думаю, это потому, что SeminarEvent создан один раз и используется указателем, поэтому каждый раз, когда один и тот же объект заполняется, и каждый раз, когда одна и та же ссылка сохраняется в массиве. Таким образом, одно из возможных решений заключается в том, чтобы написать $seminars[] = clone $seminar; вместо $seminars[] = $seminar;

+0

Я был озадачен тем, что код работал до недавнего времени, но добавление клона, как вы предложили, решило проблему. Спасибо! –