3v4l.org

run code in 300+ PHP versions simultaneously
<?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