What you currently do is chunk it into groups of 4 (so it goes 1,2,3,4; 5,6,7,8; 9,10,11,12) and then use array_column to get the Nth member of each group into the Nth column (column 1 has 1,5,9; column 2 has 2,6,10, etc).
What you want to do is chunk it so there are 4 groups, and then put the contents of the Nth group into the Nth column.
Now here's a question. If you have 10 items to put into those four columns, do you want
1 | 4 | 7 | 10
2 | 5 | 8 |
3 | 6 | 9 |
where the last "column" is incomplete, or
1 | 4 | 7 | 9
2 | 5 | 8 | 10
3 | 6 | |
where the last "row" is incomplete?
The normal answer here, with the values going column-by-column, would be the first. That means there are ceil(10 items / 4 columns) = 3 items per column, except the last which has (10 items - 3 items per column * 3 columns not counting the last) = 1 item remaining.
Fortunately you only need to figure out how many items you want in each of the 4 chunks - that is, ceil(number of items / number of columns). Then PHP will give you an array with four elements and each column can foreach over its respective chunk, just like you're doing now except you're asking it to chunk with the wrong number.