适当的解决方案

Sza*_*dor 2 php character-encoding fat-free-framework

我正在使用F3(无脂框架)进行工作中的项目,偶然发现了一个我似乎无法找到任何信息的问题.Google和官方F3文档都没有给我任何东西.也许我只是在问错误的问题.这是问题所在.

我有一个看起来像这样的数组:(city => type => building)

$places = array(
    'City A' => array(
        'special' => array(),
        'standard' => array('Campus', ),
    ),
    'City B' => array(
        'special' => array(
            'collect',
            'exam',
            'Brännässlan',
        ),
        'standard' => array(
            'Building A',
            'Building B',
            'Building C',
            'Building D (Library)',
            'Capitol',
            'Flair',
        ),
    ),
),
Run Code Online (Sandbox Code Playgroud)

我想要做的是检查数组中的每个建筑物,看看是否为它设置了相应的字典变量.我用$f3->exists('dict_select_hus_arrayValue')它来检查,它工作正常,直到函数遇到一个字母'ä'的建筑物.如果是,则会在文本中引发500错误Invalid hive key 'dict_select_hus_Brännässlan'.

我假设它与字符串的编码有关,但我在纯UTF-8环境中工作,F3应该能够处理它.还有其他人遇到过这个,更重要的是,找到了问题的解决方案吗?

geo*_*007 5

F3不允许将特定于语言的字符用作配置单元中的键.我不确定这是有意还是无意,但这个问题的根本原因在于课堂&ref方法Base.你会发现244号线附近的某个地方preg_match('/^\w+$/',$parts[0]).这将false在您的情况下返回,因为语言特定字符不在\w.

我的建议是要么改变这个表达式以包括你使用的那些字符(你需要记住这个修改,以防你以后升级F3或由于某种原因重置它)或者在用F3检查之前删除它们的字符串.


ikk*_*kez 5

正如@ george007发现的那样,蜂巢键不允许有特殊的字符.但这仅适用于第一个 hive密钥段$part[0].它可以自由地使用它更深一层.所以city.Brännässlan应该没问题.只需将您的城市和dictonary条目放入更深层次.即:

$f3->set('places',$places);

郎文件:

dict.select_hus.Brännässlan = XY
dict.select_hus.Kairo = YZ
Run Code Online (Sandbox Code Playgroud)

PHP:

foreach ($f3->get('places') as $c_name => $city) {
  if ($f3->exists('dict.select_hus.'.$c_name)) {
    // it's there
  }
}
Run Code Online (Sandbox Code Playgroud)

来自http://fatfreeframework.com/base#set的一张NB

请记住:Hive键区分大小写.此外,根据这些允许的字符检查根蜂巢密钥的有效性:[az AZ 0-9 _]