Как получить имя ключа в массиве
Это звучит довольно просто, но я не могу заставить его работать. Я пытаюсь сгруппировать ключи с одинаковым значением. Я могу узнать номер ключа, но не могу узнать имя ключа. то есть"Лондон, Берлин". Вот мой код:
$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/>'; }
<?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: Рим, Берлин