在数组中将多个键分配给相同的值

13
 $lang = array(
        'thank you'=>'You are welcome',
        'thanks'=>'You are welcome',
        'thank ya'=>'You are welcome'
    );

正如您所看到的,编写多个键表示相同值的操作将变得繁琐。是否有任何方法可以简化这个过程呢?

$lang['thanks']=>$lang['thank ya']=>$lang['thank you']

我只是想在这里节省一些时间,避免重复编写百遍

PHP类函数:

function fetch_key($key, $l,$bool){
    $dynamic = new l18n;
     if($bool == true or is_null($bool)){
        return addslashes( $dynamic->convert($key,$l) );
     }else{
      return  $dynamic->convert($key,$l);
     }
  }
EX
 $lang = array(
        'thank you'=>'You are welcome',
        'thanks'=>'You are welcome',
        'thank ya'=>'You are welcome',
        'hello'=>'hello',
        'goodbye'=>'goodbye'
    ); 

所以我需要使它将其添加到数组中,而不是用相同的值填充我的键值,实际上它们并不完全相同。我应该在开始时声明这一点。


5
我会将数组翻转,这样'You are welcome'会指向所有可能的等价值,而不是所有等价值都指向同一个值。这样做也会减少内存使用。 - user1932079
嗯,我是 PHP 的新手,所以除了 array 之外,我对 array_search 或任何数组函数都不确定 :) 我知道 isset 总是设置的,因为在发布 l18n 文件之前,我自己编写基础设施。你需要向我展示你在说什么,因为我对这一切都很陌生。我的 js 做的是,如果出现单词 hello,它会搜索 js:lang.hello 并使用该响应作为我的头文件。顺便说一下,我的 php 将 php 转换为 js 文件。 - EasyBB
如果你对任何一种编程语言都是新手,那么你肯定会想要查阅文档,因为原生函数通常比其他实现更快。对于PHP数组函数,文档可以在http://us3.php.net/manual/en/ref.array.php找到。 - user1932079
值得一提的是,在任何编程语言中,如果你不得不一遍又一遍地输入相同的内容...那么很可能有更好的方法来解决它。 - user1932079
是的,我曾经尝试阅读那些东西,但它们让我更加困惑。我一直都是一个自学者,通过自己使用函数并独立学习它们的工作原理,这使得整个过程对我来说完全容易了100%。不过我还是会继续阅读相关内容的。 - EasyBB
显示剩余3条评论
4个回答

28
你可以使用array_fill_keys()函数:
$keys = array('thank you','thanks','thank ya');
$lang = array_fill_keys($keys, 'You are welcome');

示例


1
@EasyBB:嗯,你可以使用array_fill_keys()为每个数组填充键值,然后使用array_merge()将所有数组合并成一个。由于所有键都是唯一的,所以不应该出现任何问题。 - potashin
好的,那么做 $thanks =array('谢谢','感谢','多谢');$otherArray = array('一个','两个','三个','四个'); 然后像这样合并 array_merge($thanks,$otherArray); - EasyBB
1
@EasyBB:是的,确切无误。 - potashin
1
@EasyBB: 他说过,你可以通过这种方式优化你的结构:array('You are welcome' => array(), 'hello'=>array('hello','hi',...),...) 我认为这也是一个好主意。 - potashin
无论如何,感谢您的帮助,我将不得不试用它并考虑最佳方法,我正在尝试为我的API创建一个干净的l18n文件,仍有很多要学习的东西,好在我正在上大学学习这个哈哈。 - EasyBB
显示剩余4条评论

3
虽然你承认自己刚接触这门语言并且没有做过足够的研究,我不太愿意提供代码解决方案,但我希望这个项目是你用来学习语言而不是直接为客户提供性能不佳的产品。
编辑:我看到你说“幸好我正在上大学学这个”,我很高兴我提供了帮助。
以下是一个结构,可以实现我认为你想要做的事情。
<?php
class StandardizeSayings {
  public static $CONVERSIONS = array(
    'You are welcome' => array(
      'thank you',
      'thanks',
      'thank ya'
      ),
    'Hello' => array('hello'),
    'Goodbye' => array('goodbye', 'good bye')
  );

  public static function getStandardization($word) {
    $word_lowercase = strtolower($word);
    foreach (StandardizeSayings::$CONVERSIONS as $conversion=>$equivalents) {
      if (array_search($word_lowercase, $equivalents) !== false) {
        return $conversion;
      }
    }
    return '';
  }
}

echo StandardizeSayings::getStandardization('thank ya');
?>

它使用具有静态成员/方法的类结构(因此不需要实例化该类)。 它易于通过预定义的转换列表进行扩展(需要在运行时添加其他转换的工作)。 它应该也会运行得相当快。

2
我知道这个问题很老,但我认为我的答案可能有所帮助:
$arr = [
    "one" => "value",
    "two" => "more value"
];

$arr["three"] = $arr["four"] = $arr["five"] = "same value";

2
我会在三个步骤中完成:
1 - 定义唯一值
2 - 填充重复值
3 - 合并步骤1和步骤2。
$lang = array(
    'hello'=>'hello', 
    'goodbye'=>'goodbye'
);

$keys = array('thank you','thanks','thank ya');
$result = array_fill_keys($keys, 'You are welcome');

$lang += $result;

看一下 array_fill_keys数组操作符 +=


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接