Как соединить массив по ключу?
Тех, кто говорит про получение данных на уровне БД, не слушайте. У вас получается динамическое число столбцов, а здесь без реального программирования БД не обойтись. 
На самом деле, требуемая структура не является оптимальной. Во всяком случае пока нет доводов в ее пользу. Лучше на выходе получать что-то вроде того, что приведу ниже. Такие данные гораздо удобнее в дальнейшем обрабатывать.$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-значения и прочие вводите по необходимости, в зависимости от ограничений на таблицах БД.
Вообще то это на уровне бд нужно делать. Если Mysql то group by year