奇怪的str_replace行为

时间:2014-10-17 08:24:18

标签: php

这更像是一个澄清而不是一个问题,我在这里有这个代码:

$itemSizeArray = array('S' => 'Small', 'M' => 'Medium', 'L' => 'Large', 'X' => 'XLarge');
$modifierSize = 'X';
$submenuModifierDescription['SUME_DESCRIPTION'] = "Small Toppings";
echo str_replace($itemSizeArray, $itemSizeArray[$modifierSize], $submenuModifierDescription['SUME_DESCRIPTION']);

在所有情况下都可以正常工作$modifierSize = 'X';, 它输出"XXLarge Toppings"(双X)。 - 问题

在其他情况下,即当$modifierSize = 'L';输出Large Toppings时。 - 没问题

在我阅读文档之后,我用这行

修复了代码
echo str_replace($itemSizeArray['S'], $itemSizeArray[$modifierSize], $submenuModifierDescription['SUME_DESCRIPTION']);

它工作正常,但我不明白为什么。

[this] 导致此行为的第一位代码的过程是什么? [/ this]

修改:我以粗体显示[this],其他用户的强制编辑删除了粗体。我将斯坦尼斯拉夫的答案标记为正确的答案,因为他正在回答实际的问题,而不是基于问题的信息他认为我问的问题。谢谢大家的时间

4 个答案:

答案 0 :(得分:1)

您到底想要替换的内容以及目标字符串中的内容是什么?它显示奇怪行为的原因可能是因为str_replace可以期望第一个(搜索)和第二个(替换为)参数的值数组。在原始代码示例中,您提供了键值对作为针(第一个参数)。

例如,如果您要搜索S,M,L等并将其替换为Small,Medium,Large等,您可以尝试以下操作:

str_replace(array_keys($itemSizeArray), array_values($itemSizeArray), $subject);

答案 1 :(得分:1)

Docs说:

  

如果search是一个数组而replace是一个字符串,那么这个替换   string用于搜索的每个值。

所以" Small Toppings"成为" XLarge Toppings"然后,在字符串" XLarge Toppings"大变成XLarge,结果是" XXLarge Toppings"。

以下是了解正在发生的事情的小例子:

$itemSizeArray = array('Small', 'Large');
var_dump(str_replace($itemSizeArray, 'XLarge', "Small Toppings"));exit;

答案 2 :(得分:0)

我认为实现这一目标的正确方法是

  $itemSizeArray = array('S' => 'Small', 'M' => 'Medium', 'L' => 'Large', 'X' => 'XLarge');
  $modifierSize = 'X';
  $submenuModifierDescription['SUME_DESCRIPTION'] = "Small Toppings";

  echo str_replace($submenuModifierDescription['SUME_DESCRIPTION'], $itemSizeArray[$modifierSize], $submenuModifierDescription['SUME_DESCRIPTION']);

但仍然为什么会让事情复杂化。您可以在每次需要时更改菜单变量的值

 $submenuModifierDescription['SUME_DESCRIPTION'] = $itemSizeArray[$modifierSize];

您的代码在X情况下返回奇怪的结果,因为str_replace函数第一个参数是一个数组。

答案 3 :(得分:0)

itemSizeArray是一个数组,而str_replace正在替换STRING。 如果要替换数组中的所有值,则应该执行foreach循环:

foreach($ itemSizeArray as $ key => $ var)并替换你想要的东西

但正如我所看到的,如果你输入“X”,那么你试图得到“XLarge toppings”,如果你有“L”,那么就是“大型浇头”等等。

在这种情况下,这可能是代码:

$itemSizeArray = array('S' => 'Small', 'M' => 'Medium', 'L' => 'Large', 'X' => 'XLarge');
$modifierSize = 'X';
echo ($itemSizeArray[$modifierSize].' Toppings');

这是因为itemsizearray已经是一个关联数组,所以你可以按键来解决这些元素。