Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简化相同的php条件_Php_Templates_If Statement_Printf - Fatal编程技术网

简化相同的php条件

简化相同的php条件,php,templates,if-statement,printf,Php,Templates,If Statement,Printf,我有一个问题,我想知道根据一种语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我有sthg simple: function getStringA($lang,$data1,$data2){ if($lang=='en'){return 'my string is '.$data1.' and '.$data2;} elseif($lang=='fr'){return 'ma chaine est '.$data1.' et '.$data2;} elseif($lan

我有一个问题,我想知道根据一种语言打印许多不同字符串的最佳方法是什么,我的意思是,今天我有sthg simple:

function getStringA($lang,$data1,$data2){
   if($lang=='en'){return 'my string is '.$data1.' and '.$data2;}
   elseif($lang=='fr'){return 'ma chaine est '.$data1.' et '.$data2;}
   elseif($lang=='it'){return $data1.'blabla '.$data2.' blabla';}
   ..
   [50 conditions]
}

function getStringB($lang,$data){
    [same 50 conditions, one per language]
}

function getStringC($lang,$data){
  ..
}
...
然后:

echo getStringA('en','test','test1');
echo getStringB('en','AAAA');
echo getStringB('en','BBBB');
..
  • 每个函数上总是有相同的50种语言条件
  • 数据参数在字符串中的位置可以更改(在末尾,中间..)
  • 我想使用printf,但我不知道它是否真的会更好,我需要快速、最重要、易于维护的sthg

    有什么想法吗?

    为什么不用数组呢

    $conditions = ['en' => 'foo', 'fr' => 'bar', etc...]
    
    if (isset($conditions[$lang])) {
       return $conditions[$lang];
    } else {
       return $default_value;
    }
    

    将字符串放入数组中,并将串联更改为
    printf()-like
    函数格式:

    $stringsA = array(
        'en' => 'my string is %s and %s',
        'fr' => 'ma chaine est %s et %s',
        // ...
    );
    
    然后在函数中按数组键获取文本:

    function getStringA($lang,$data1,$data2){
        return isset($stringsA[$lang])? vprintf($stringsA[$lang], array($data1, $data2)) : '';
    }
    
    您还可以在字符串中使用自己的占位符和
    str\u replace()
    函数:

    // e.g. 'my string is {propery} and {secondProperty}'
    
    
    function getStringA($lang,$data1,$data2){
        return isset($stringsA[$lang])? str_replace(array('{propery}', '{secondProperty}'), array($data1, $data2), $stringsA[$lang]) : '';
    }
    

    使用数组和传递参数可以使用函数


    这是非常基本的想法。它可以写得更好。翻译可以保存在ini、xml、yaml等配置文件中,也可以用OOP编写,这样使用起来会更好。

    如何传递参数?可能是另一个构建字符串的函数。但这就是你如何摆脱50项if/else/else/else/else/…../else链的方法。这不仅仅是返回翻译后的字符串,而是如何使用语言模板构建带有参数的字符串(参数在字符串中的位置可能会改变,取决于语言)。谢谢,但非常沉重,我终于找到了一个窍门,请阅读我的回答,不要太重,但要灵活。也许将数组作为第一个参数传递并不好,但我不想使用全局数组或静态数组。
    $translate = [
      'en' => [
         'my_string_is' => 'my string is %s and %s';
      ],
      'fr' => [
         'my_string_is' => 'ma chaine est %s et %s';
      ]
    ];
    
    function translate ($translations, $word, $lang, array $params = []) {
       return isset($translations[$lang][$word]) ? vsprintf($translations[$lang][$word], $params) : $word;
    }
    
    // usage
    
    echo translate($translations, 'my_string_is' ,'en', ['wordA', 'wordB']);
    echo translate($translations, 'my_string_is' ,'fr', ['wordA', 'wordB']);