<?php
$data = array(
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "A"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "B"),
array( "name" => "SomeName", "type" => "C"),
array( "name" => "SomeName", "type" => "C")
);
// split data into arrays of distinct type
$buckets = array_reduce($data, function($result, $item) {
$type = $item["type"];
if (!isset($result[$type])) {
$result[$type] = [];
}
array_push($result[$type], $item);
return $result;
}, []);
// sort buckets by size
usort($buckets, function($a, $b) {
return count($b) - count($a);
});
// merge buckets to single array sorted by type
// and split to chunks of size of the largest bucket
$table = array_chunk(array_merge(...$buckets), count($buckets[0]));
// compute final array by merging each column
$result = [];
foreach (array_keys($table[0]) as $i) {
$result = array_merge($result, array_column($table, $i));
}
print_r($result);
- Output for 5.6.38 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.31, 8.2.0 - 8.2.26, 8.3.0 - 8.3.15, 8.4.1 - 8.4.2
- Array
(
[0] => Array
(
[name] => SomeName
[type] => A
)
[1] => Array
(
[name] => SomeName
[type] => B
)
[2] => Array
(
[name] => SomeName
[type] => A
)
[3] => Array
(
[name] => SomeName
[type] => B
)
[4] => Array
(
[name] => SomeName
[type] => A
)
[5] => Array
(
[name] => SomeName
[type] => B
)
[6] => Array
(
[name] => SomeName
[type] => A
)
[7] => Array
(
[name] => SomeName
[type] => C
)
[8] => Array
(
[name] => SomeName
[type] => A
)
[9] => Array
(
[name] => SomeName
[type] => C
)
)
preferences:
97.07 ms | 410 KiB | 5 Q