Хранение массива в базе данных

Очень часто появляется необходимость хранить массив с теми или иными данными в базе, однако многие разработчики, особенно новички часто не находят подходящего решения в данной ситуации и начинают изобретать велосипед. На днях разрабатывал систему опроса для крупного портала, долго думал как лучше обрабатывать огромную анкету из сорока вопросов, пока думал количество вопросов все росло и росло. В конце концов вспомнил про serialize.

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

Итак, допустим у вас есть массив

<? $array = array( 1, 2, 3 ); ?>

в принципе структура массива роли не играет, да и размеры тоже. Конечно когда массив не большой и количество его элементов известно то в базе можно создать нужное количество полей и быть спокойным, но очень как правило такой возможности нет, да и в случае добавления еще одного элемента к массиву нужно будет делать много телодвижений что б все хорошо работало.
Вот именно тут на помощь приходит функция serialize.

<? $array = array( 1, 2, 3 ); $string = serialize( $array ); echo $string; ?>
теперь переменная $string содержит так сказать строковую версию массива $array и при выводе на печать выдаст следующее

a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}

согласитесь, хранить такую строку в MySql гораздо удобнее и проще нежели выделять под каждый элемент массива свою ячейку в таблице. Естественно рано или поздно эту строку нужно будет преобразовать обратно в массив, для этого есть функция обратная serialize, а именно unserialize.

<? $array = array( 1, 2, 3 ); $string = serialize( $array ); echo $string; $array = unserialize( $string ); print_r($array); ?>

теперь мы имеем в переменной $array исходный массив.

Самое главное все же не увлекайтесь с этой функцией, так как большой массив будет представлять достаточно большую строку, кстати для сжатия можно использовать функцию gzcompress, но естественно потом придется вернуть в начальный вид функцией gzuncompress.