PHP: разбить массив строк на многомерный массив - PullRequest
0 голосов
/ 21 июня 2010

У меня есть массив часовых поясов:

$timezones = array(
    'Africa/Abidjan',
    'Africa/Accra',
    ...
    'America/Argentina/Buenos_Aires',
    'America/Argentina/Catamarca',
    ...
    'Pacific/Wallis',
    'UTC',
);

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

$timezones = array(
    'Africa' => array('Abidjan', 'Accra', ... ),
    'America' => array(..., 'Argentina' => array('Buenos_Aires', 'Catamarca', ...), ...),
    ...
    'Pacific' => array(..., 'Wallis'),
    'UTC',
);

Ответы [ 2 ]

3 голосов
/ 21 июня 2010
$splitted = array();
foreach ($timezones as $timezone)
{
    $items = explode('/', $timezone);
    add_to_array($splitted, $items);
}
print_r($splitted);

function add_to_array(& $destination, $values)
{
    if (count($values) == 1)
    {
        $destination[] = $values[0];
    }
    else
    {
        $first = array_shift($values);
        add_to_array($destination[$first], $values);
    }
}
0 голосов
/ 21 июня 2010

Нерекурсивная хакерская версия с использованием eval():

$output = array();

foreach ( $timezones as $zone ) {
    if ( strpos($zone, '/') !== FALSE ) {
        $str = preg_replace('#/([^/]+)$#', "'][] = '$1';", $zone);
        $str = str_replace('/', "']['", $str);
        $str = '$output[\''.$str;
        eval($str);
    } else {
        $output[$zone] = '';
    }
}
print_r($output);
...