Как отсортировать массив такого вида?
Подскажите как отсортировать такой массив. 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
)
)
Если исходный массив упорядочен, то бьете его на нужное число частей. потом берете соединяете по индексам, и сливаете обратно
$result = array_merge(...array_map(null, ...array_chunk($arr, 3)));