str_replace问题(字母和数字)

时间:2014-07-30 11:11:34

标签: php string replace str-replace

我想要用字母代替数字:

<?php
$text = 'I have 10 apples';
$numbers = array(0, 1, 2,..., 10);
$letters = array('zero', 'one', 'two',... 'ten');
echo str_replace($numbers, $letters, $text); 
// output is 'I have onezero apples' instead of 'I have ten apples'
?>

如何才能生成正确的输出?它不仅适用于数字,也适用于单词($number数组内部也可以是字母/单词)

3 个答案:

答案 0 :(得分:1)

$text = 'I have 10 apples';
$numbers = array(10, 0, 1, 2);
$letters = array('ten','zero', 'one', 'two');
echo str_replace($numbers, $letters, $text);

但如果您在更换前添加了更多需要使用的语句或类似的比较,那么这不是长期解决方案

答案 1 :(得分:1)

您应该简单地按照密钥长度对数组进行降序排序,它将同时用于数字和其他字符串。以下代码适合您:

<?php
$text = 'I have 10 (or 21) apples and I would like to bake an apple pie';
$numbers = array(0, 1, 2, 10, 21, ' a ', ' an ');
$letters = array('zero', 'one', 'two','ten','twenty one',' A ',' AN ');

$data = array_combine($numbers, $letters);

krsort($data, SORT_STRING);

echo str_replace(array_keys($data), array_values($data), $text);

// Output: I have ten (or twenty one) apples and I would like to bake AN apple pie
?>

修改

对于以下输入数据:

$text = 'An 1 Anha 2 Anh 21';
$numbers = array(0, 1, 2, 10, 21, ' a ', ' an ', 'An','Anh', 'Anha');
$letters = array('zero', 'one', 'two','ten','twenty one',' A ',' AN ', 'Hi', 'Hello', 'Bye');

$data = array_combine($numbers, $letters);

krsort($data, SORT_STRING);

echo str_replace(array_keys($data), array_values($data), $text);

使用相同的方法会给你:

  

你好,再见两个你好二十一岁

按预期输出

如何运作 - 解释

使用array_combine()函数,您可以创建一个新数组,其中包含来自$numbers数组的键和来自$letters的值。此函数仅用于2个独立数组中的输入数据。如果在开头使用了关联数组:$data[0] => 'zero'; ... $data[1] => 'one';, ....这个函数是不必要的。

现在因为某些键可能包含其他键,所以您需要以较短的键之前的方式对数据进行排序。这使得10将更改为ten而不是one zero。您可以使用krsort()函数对数组进行排序,使用键进行比较(使用array_combine,我们的键现在是来自$numbers数组的数据),使用SORT_STRING比较以相反的顺序排序,这样如果我们有单词{ {1}}它会将其反向排序(正常的其他为c, a, ccc and cc),因此它们将为a, c, cc, ccc

排序后,我们需要将数据传递给ccc, cc, c, a。这个功能需要键和值,我们没有将它们分开,因为之前我们使用str_replace创建了一个数组并对其进行排序。但我们现在可以使用array_combine()array_keys()函数从该数组中获取键和值。

答案 2 :(得分:0)

问题在于它首先将1替换为one,然后0替换zero

正如所建议的那样,你可以改变顺序,这样它首先会寻找更高的数字,但同时也说这是一条漫长的道路。

请改为检查此问题:Is there an easy way to convert a number to a word in PHP?

或者,尝试preg_match

或者让PHP反转数组:

$numbers = array_reverse(array(0, 1, 2,..., 10));
$letters = array_reverse(array('zero', 'one', 'two',... 'ten'));