array_flip () и utf8 - PullRequest
       27

array_flip () и utf8

2 голосов
/ 18 марта 2011

У меня есть массив (18 ключей):

$en = array(
    'Ą' => 'A',
    'Č' => 'C',
    'Ę' => 'E',
    'Ė' => 'E',
    'Į' => 'I',
    'Š' => 'S',
    'Ų' => 'U',
    'Ū' => 'U',
    'Ž' => 'Z',
    'ą' => 'a',
    'č' => 'c',
    'ę' => 'e',
    'ė' => 'e',
    'į' => 'i',
    'š' => 's',
    'ų' => 'u',
    'ū' => 'u',
    'ž' => 'z',
);

эти ключи являются литовскими символами (кодировка utf8).Когда я делаю $lt = array_flip($en);, он возвращает следующее:

Array
(
    [A] => Ą
    [C] => Č
    [E] => Ė
    [I] => Į
    [S] => Š
    [U] => Ū
    [Z] => Ž
    [a] => ą
    [c] => č
    [e] => ė
    [i] => į
    [s] => š
    [u] => ū
    [z] => ž
)

, как вы видите, отсутствуют 4 клавиши ('Ę', 'Ų', 'ę', 'ų').Что здесь происходит?

1 Ответ

10 голосов
/ 18 марта 2011

Ничего общего с UTF-8 здесь нет; просто механика массива / хеш-таблицы.

Эти ключи:

'Ę' => 'E',
'Ė' => 'E',

'Ų' => 'U',
'Ū' => 'U',

'ę' => 'e',
'ė' => 'e',

'ų' => 'u',
'ū' => 'u',

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

[E] => Ė

[U] => Ū

[e] => ė

[u] => ū

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

...