Тех, кто говорит про получение данных на уровне БД, не слушайте. У вас получается динамическое число столбцов, а здесь без реального программирования БД не обойтись.
На самом деле, требуемая структура не является оптимальной. Во всяком случае пока нет доводов в ее пользу. Лучше на выходе получать что-то вроде того, что приведу ниже. Такие данные гораздо удобнее в дальнейшем обрабатывать.
$arr = array(array('id' => 1, 'year' => 2013, 'name' => "Александр"),
array('id' =>2, 'year' => 2013, 'name' => "Сергей"),
array('id' => 3, 'year' => 2012, 'name' => "Никита"),
array('id' => 4, 'year' => 2012, 'name' => "Володя"));
function by_year($arr) {
$result = array();
foreach ($arr as $l) {
$result[$l['year']][] = $l['name'];
}
return $result;
}
print_r(by_year($arr));
Результат:
Array
(
[2013] => Array
(
[0] => Александр
[1] => Сергей
)
[2012] => Array
(
[0] => Никита
[1] => Володя
)
)
Если нужно сохранять id пользователя, то ставьте его на место ключа (
$result[$l['year']][$l['id']] = $l['name'];).
Проверки на NULL-значения и прочие вводите по необходимости, в зависимости от ограничений на таблицах БД.