Как отсортировать массив такого вида?

Подскажите как отсортировать такой массив. id_block это ключ, и он всегда такой. Значения id_block всегда в таком виде,цифра строкой. Суть в том что количество значений id_block всегда одинаково. Т.е. кол-во единичек, двое и троек. И соответственно их нужно преобразовать в такой вид. Они как-бы следуют друг за другом до повышения значения до максимального значения, потом повторяются и опять друг за другом. Само повторение следования друг за другом это количество значений допусти '1'. Опять же кол-во 1,2,3 всегда одинаково, в данном примере их 3.

$arr = [
    0 => ['id_block' => '1'],
    1 => ['id_block' => '1'],
    2 => ['id_block' => '1'],
    3 => ['id_block' => '2'],
    4 => ['id_block' => '2'],
    5 => ['id_block' => '2'],
    6 => ['id_block' => '3'],
    7 => ['id_block' => '3'],
    8 => ['id_block' => '3'],

];

в такой

$arr = [
    0 => ['id_block' => '1'],
    1 => ['id_block' => '2'],
    2 => ['id_block' => '3'],
    3 => ['id_block' => '1'],
    4 => ['id_block' => '2'],
    5 => ['id_block' => '3'],
    6 => ['id_block' => '1'],
    7 => ['id_block' => '2'],
    8 => ['id_block' => '3'],
]; 

Ответы (2 шт):

Автор решения: Сергей Мишин

$maxNumber - нужен, чтобы формировать цифры в динамическом диапазоне, если неизвестно какой максимум. В примере это 3, а может быть 4,5,6 и т.д.

// input
$arr = [
    0 => ['id_block' => '1'],
    1 => ['id_block' => '1'],
    2 => ['id_block' => '1'],
    3 => ['id_block' => '2'],
    4 => ['id_block' => '2'],
    5 => ['id_block' => '2'],
    6 => ['id_block' => '3'],
    7 => ['id_block' => '3'],
    8 => ['id_block' => '3'],

];

-------------------------

$maxNumber = (int)(end($arr)['id_block']);

for ($i = 0, $j = 1; $i < count($arr); ++$i, ++$j) {
    $arr[$i] = ['id_block' => $j];
    
     if ($j === $maxNumber)
         $j = 0;
}

-------------------------
// output
print_r($arr);

Array
(
    [0] => Array
        (
            [id_block] => 1
        )

    [1] => Array
        (
            [id_block] => 2
        )

    [2] => Array
        (
            [id_block] => 3
        )

    [3] => Array
        (
            [id_block] => 1
        )

    [4] => Array
        (
            [id_block] => 2
        )

    [5] => Array
        (
            [id_block] => 3
        )

    [6] => Array
        (
            [id_block] => 1
        )

    [7] => Array
        (
            [id_block] => 2
        )

    [8] => Array
        (
            [id_block] => 3
        )

)
→ Ссылка
Автор решения: teran

Если исходный массив упорядочен, то бьете его на нужное число частей. потом берете соединяете по индексам, и сливаете обратно

$result = array_merge(...array_map(null, ...array_chunk($arr, 3)));
→ Ссылка