array_flip()和utf8

egi*_*gis 2 php arrays utf-8 transliteration

我有一个数组(18键):

$en = array(
    '?' => 'A',
    '?' => 'C',
    '?' => 'E',
    '?' => 'E',
    '?' => 'I',
    'Š' => 'S',
    '?' => 'U',
    '?' => 'U',
    'Ž' => 'Z',
    '?' => 'a',
    '?' => 'c',
    '?' => 'e',
    '?' => 'e',
    '?' => 'i',
    'š' => 's',
    '?' => 'u',
    '?' => 'u',
    'ž' => 'z',
);
Run Code Online (Sandbox Code Playgroud)

这些键是立陶宛simbols(utf8编码).当我这样做$lt = array_flip($en);时返回以下内容:

Array
(
    [A] => ?
    [C] => ?
    [E] => ?
    [I] => ?
    [S] => Š
    [U] => ?
    [Z] => Ž
    [a] => ?
    [c] => ?
    [e] => ?
    [i] => ?
    [s] => š
    [u] => ?
    [z] => ž
)
Run Code Online (Sandbox Code Playgroud)

你可以看到4个键丢失('Ę','Ų','ę','ų').这里发生了什么?

Bol*_*ock 10

这里与UTF-8没什么关系; 只是简单的数组/哈希表机制.

这些键:

'?' => 'E',
'?' => 'E',

'?' => 'U',
'?' => 'U',

'?' => 'e',
'?' => 'e',

'?' => 'u',
'?' => 'u',
Run Code Online (Sandbox Code Playgroud)

对应于成对的相同值.翻转数组时,每对中的下一个会覆盖前一个数组,因为单个数组中不能有两个相同的键.因此结果如下:

[E] => ?

[U] => ?

[e] => ?

[u] => ?
Run Code Online (Sandbox Code Playgroud)

如果您需要将英文字母映射到这样的立陶宛字母,您可能需要编写一个自定义函数,将多个立陶宛字母放在一个数组中,对应于相同的英文字母键(或更确切地说,值).