Как получить имя ключа в массиве

Это звучит довольно просто, но я не могу заставить это работать. Я пытаюсь сгруппировать ключи с одинаковым значением. Я могу получить номер ключа, но не могу получить название ключа. Т.е. «Лондон, Берлин».
Это мой код:

$countries = array (
'London' => 'Europe/London',
'Istanbul' => 'Europe/Istanbul',
'Rome' => 'Europe/Rome',
'Berlin' => 'Europe/Berlin',
'Athens' => 'Europe/Athens',
);$offsets = Array();
foreach ($countries as $country_offset) {
$offset = timezone_offset_get( new DateTimeZone( $country_offset ), new DateTime() );

array_push($offsets, $offset);
}

$result = array_unique($offsets);
asort($result);

$keys = array_keys($result);
foreach($keys as $key) {
$numb = array_keys($offsets, $offsets[$key]);

echo $offsets[$key] . ' - ' . implode(', ', $numb ) . '<br>';
}

2

Решение

Я бы предложил сначала создать полную группу информационных массивов, включающую нужный ключ, а не создавать презентацию, отображающую ключ исходного ввода.

Идея:

$offsets = array(); // initialize
foreach($countries as $key => $country_offset) { // grouping
$offset = timezone_offset_get( new DateTimeZone( $country_offset ), new DateTime() );
$offsets[$offset][] = array(
'name'      => $key, // include me instead!
'offset'    => $offset,
'timezome'  => $country_offset,
);
}
ksort($offsets); // sort

Важным моментом здесь является то, что сгруппируйте их внутри контейнера, используя смещение в качестве ключа:

$offsets[$offset][] = array(
//       ^ reassignment grouping using the offset as key

Затем в своей презентации решите, что вы хотите:

// presentation
foreach($offsets as $offset => $info) {
echo $offset . ' - ';
$temp = array();
foreach($info as $t) {
$temp[] = $t['name'];
}
echo implode(', ', $temp);
echo '<br/>';
}

Если array_column доступно, просто используйте его:

foreach($offsets as $offset => $info) {
echo $offset . ' - ' . implode(', ', array_column($info, 'name')) . '<br/>';
}

Пример вывода

2

Другие решения

 <?php
$countries = array (
'London' => 'Europe/London',
'Istanbul' => 'Europe/Istanbul',
'Rome' => 'Europe/Rome',
'Berlin' => 'Europe/Berlin',
'Athens' => 'Europe/Athens',
);

$out=array();
foreach ($countries as $country_offset=>$c) {
$offset = timezone_offset_get( new DateTimeZone( $c ), new DateTime() );$out[$offset][]=$country_offset;
}
//print_r($out);

foreach($out as $x=>$y){

echo $x.': '.implode(',',$y).'<br>';
}

//выход:

3600: Лондон
10800: Стамбул, Афины
7200: Рим, Берлин

1