Похоже, есть две части того, что вы хотите - сортировка и отображение.
Для сортировки вы хотите использовать usort
с небольшой функцией, определяющей сравнение
$sortFunc = function($a,$b) {return $a['city'] != $b['city']
? $a['city'] > $b['city']
: $a['name'] > $b['name'];};
// = function($a,$b) {return $a['city'] > $b['city'] || ($a['city'] == $b['city'] && $a['name'] > $b['name']);};
// = function($a,$b) {return 100*strcmp($a['city'],$b['city']) + strcmp($a['name'],$b['name']);};
usort($arr, $sortFunc);
function displayNamesGroupedByCity($arr)
{
$lastCity = '';
foreach($arr as $v)
{
if ($v['city'] != $lastCity)
{
$lastCity = $v['city'];
echo "<br /><strong>$lastCity</strong><br />";
}
else echo ', ';
echo $v['name'];
}
}
displayNamesGroupedByCity($arr);
Черт возьми, я собираюсь сделать что-то общее
function displayXgroupedByY($arr, $x, $y)
{
$sortFunc = function($a,$b) use($x,$y)
{return $a[$y] != $b[$y]
? $a[$y] > $b[$y]
: $a[$x] > $b[$y];};
user($arr, $sortFunc);
$lastCity = '';
foreach($arr as $v)
{
if ($v['city'] != $lastCity)
{
$lastCity = $v['city'];
echo "<br /><strong>$lastCity</strong><br />";
}
else echo ', ';
echo $v['name'];
}
return $arr;
}
displayXGroupedByY($arr, 'name', 'city');