【问题标题】:PHP: Array translation problemsPHP:数组翻译问题
【发布时间】:2015-11-03 15:07:29
【问题描述】:

这是我的数组:

$class = $row["class"];
 $classes = array( '1', '2', '4', '5', '6', '7', '8', '9', '10', '11'
    );
 $replacements = array( 'Warrior', 'Paladin', 'Hunter', 'Rogue',
   'Priest', 'Death Knight', 'Shaman', 'Mage', 'Warlock', 'Monk',
   'Druid' );
 $resultclass = str_replace( $classes, $replacements, $class );

我的问题是,当我从数据库中获取数字 11 时,它会显示两次“战士”而不是“德鲁伊”

我该如何解决?

【问题讨论】:

  • $class 中有什么?数据库到底在哪里?这些只是数组...
  • $resultclass = strtr($class , $classes, $replacements);
  • 不是最好的,但是如果你的类不会变得更多,你可以在你的 $classes 数组中切换111,所以首先它将替换 11 和更高版本1 xD
  • 阅读PHP Docs,它有一个关于str_replace Replacement order gotcha Because str_replace() replaces left to right, it might replace a previously inserted value when doing multiple replacements. See also the examples in this document. 的大警告
  • 看看这个问答——可以使用preg_replace:stackoverflow.com/questions/9416175/…

标签: php arrays


【解决方案1】:

为什么不直接做:

$replacements = array( 'Warrior', 'Paladin', 'Hunter', 'Rogue', 
   'Priest', 'Death Knight', 'Shaman', 'Mage', 'Warlock', 'Monk','Druid' );

$resultclass = $replacements[$row["class"] - 1];

【讨论】:

  • 由于类号和值没有关联,我认为这是一个很好的解决方案;我会赞成这个
  • 是的。看看这个问题,他似乎只是想将一个数字“翻译”成一个名字,而这正是这样做的。使用 preg_replace 或其他任何东西似乎都是最重要的。
【解决方案2】:

为什么不这样做,也将它存储为数组并从数组中加载它。

<?PHP
    $class = $row["class"];
    $classes = array( 
    '0' => 'Warrior' , '1' => 'Paladin' , '2' => 'Hunter' , '3' => 'Rogue', 
    '4' => 'Priest', '5' => 'Death Knight', '6' => 'Shaman',
    '7' => 'Mage', '8' => 'Warlock', '9' => 'Monk' ,'10' => 'Druid' ,
    );

     $resultclass = $classes[$class];
     ?>

【讨论】:

    【解决方案3】:

    因为 "11" = "1"."1" 总是会替换第一个匹配项。

    更新

    可以使用array_reverse:

        $class = "11";
     $classes = array_reverse(array( '1', '2', '4', '5', '6', '7', '8', '9', '10', '11'
        ));
     $replacements = array_reverse(array( 'Warrior', 'Paladin', 'Hunter', 'Rogue',
       'Priest', 'Death Knight', 'Shaman', 'Mage', 'Warlock', 'Monk',
       'Druid' ));
     $resultclass = str_replace( $classes, $replacements, $class );
    
    var_dump($resultclass);
    

    现在第一个匹配将从大数字开始到最小,但要小心,如果你有 12 个,这将使你的第 12 个元素不是“1”。“2”

    【讨论】:

      【解决方案4】:

      str_replace 的工作方式是迭代您的 $search 数组(第一个参数),并将每个找到的值替换为 $replace 数组(第二个参数)中相同 index 处的值。替换的优先级按照数组定义的顺序排列。

      现在,当函数处理您的第一个搜索字符串“1”时,它会在您的字符串“11”处找到两个对应的值。这就是为什么你应该得到“WarriorWarrior”而不是“Druid”。

      您可以通过恢复数组的顺序来“快速”修复该行为:

      $classes = array_reverse($classes);
      $replacements = array_reverse($replacements);
      

      但是如果你想要一对一的替换,其实不需要str_replace。你可以这样做:

      $class_index = array_search($class, $classes);
      $resulting_class = $replacements[$class_index];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 2011-10-05
        • 2015-02-14
        • 2012-10-27
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多