我想要用字母代替数字:
<?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
数组内部也可以是字母/单词)
答案 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'));