<?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);
preferences:
32 ms | 412 KiB | 5 Q