【问题标题】:Assign multiple keys to same value in array将多个键分配给数组中的相同值
【发布时间】:2026-01-15 16:05:01
【问题描述】:
 $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'
    ); 

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

【问题讨论】:

  • 我会翻转数组,使'You are welcome' 指向所有可能的等价物,而不是所有等价物都指向相同的值。这也将使用更少的内存。
  • 嗯,我有一个很长的数组,我使用的类如:查看我的新更新。我们使用 JS 将字符串作为算法进行搜索,然后使用默认语言解析出响应。所以让你受欢迎是行不通的。
  • 我在您的修改中看不到任何妨碍更清洁结构的内容。在某些时候,您可能正在使用isset($lang[$word]),并且可以轻松地循环并使用array_search 函数。
  • 嗯,我是 php 的新手,所以我不确定 array_search 或除数组之外的任何数组函数 :) 我知道 isset 总是设置的,因为我在发布之前自己编写基础设施l18n 文件。您必须向我展示您在说什么,因为我是这一切的新手。我的 js 所做的是,如果出现 hello 这个词,它会搜索 js:lang.hello 并使用该响应我的 php 标头将 php 变成一个 js 文件 btw
  • 如果您不熟悉任何语言,那么您总是希望查看文档,因为本机函数通常比其他实现更快。对于 PHP 数组函数,文档位于 us3.php.net/manual/en/ref.array.php

标签: php arrays key key-value


【解决方案1】:

你可以使用array_fill_keys()

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

Example

【讨论】:

  • 谢谢notulysses!我很感激,我还在学习 php,所以其中一些函数对我来说是新的。
  • @EasyBB :很高兴为您提供帮助!
  • @EasyBB :好吧,您可以为每个数组执行array_fill_keys(),然后使用array_merge() 将所有数组合并为一个。由于所有键都是唯一的,因此应该没有问题。
  • @EasyBB :是的,完全正确
  • @EasyBB :他说,你可以像array('You are welcome' => array(),'hello'=>array('hello','hi',...),...) 那样优化你的结构,我认为这也是一个好主意。
【解决方案2】:

当你承认你是这门语言的新手并且没有好好研究它时,虽然我不愿提供代码解决方案,但我希望这个项目是你在玩这门语言来学习它而不是一头扎进地给客户一些最终不会表现良好的东西。

编辑:刚刚看到你的“好东西我要为此上大学”,很高兴我发帖来提供帮助。

这是一个结构,我相信你正在寻求做的事情。

<?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');
?>

它使用具有静态成员/方法的类结构(因此不需要类的实例化)。使用预定义的转换列表很容易扩展(需要在运行时添加额外的转换。)它也应该运行得相当快。

【讨论】:

    【解决方案3】:

    我分三步做:

    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_keysArray Operators +=

    【讨论】:

      【解决方案4】:

      我知道这个问题很老,但我认为我的回答可能会对某人有所帮助:

      $arr = [
          "one" => "value",
          "two" => "more value"
      ];
      
      $arr["three"] = $arr["four"] = $arr["five"] = "same value";
      

      【讨论】:

        最近更新 更多