Это должно быть сделано с существующей структурой за одну итерацию ( demo ):
$currentCompanyId = 0;
foreach ($array as $company) {
if ($currentCompanyId !== $company['company_id']) {
printf("%s\n", $company['company_name']);
$currentCompanyId = $company['company_id'];
}
printf("\t-%s\n", $company['user_name']);
}
Выход:
ABC Company
-Andrew
-Jeffrey
Some Company
-William
My Company
-Jaime
Фрагмент предполагает, что массив отсортирован по названию компании (как показано в вашем примере кода). Если это не так, сначала выполните сортировку по идентификатору компании:
usort($array, function($companyA, $companyB) {
return $companyA['company_id'] - $companyB['company_id'];
});