Php str_替换问题(字母和数字)

Php str_替换问题(字母和数字),php,string,replace,str-replace,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' ?&g

我想用字母替换数字:

<?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
数组中也可以是字母/单词)


但是,如果在进行替换之前添加了更多需要使用if语句或类似语句进行比较的值,则这不是长期解决方案。问题是,它首先将
1
替换为
1
,然后将
0
替换为
0

正如建议的那样,你可以颠倒顺序,这样它将首先寻找更高的数字,但正如所说,这可能是一条漫长的道路

请勾选此问题:

或者,尝试
预匹配

或者让PHP反转数组:

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

您只需按键长降序对数组排序,它将同时对数字和其他字符串进行排序。以下代码应适用于您:

<?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
?>
使用相同的方法将为您提供:

嗨,一,再见,二,你好,二十一

按预期输出

它是如何工作的-解释

使用
array\u combine()
函数可以创建一个新数组,其中包含
$numbers
数组中的键和
$letters
中的值。仅当输入数据位于两个单独的数组中时,才使用此函数。如果在开头使用了关联数组:
$data[0]=>“zero”$数据[1]=>“一”此函数将是不必要的

现在,由于某些键可能包含其他键,因此需要对数据进行排序,使最长的键优先于较短的键。它使
10
变为
10
,而不是
1 0
。您可以使用
krsort()
函数,使用用于比较的键对数组进行排序(使用array\u combine,我们的键现在是
$numbers
数组中的数据),使用
SORT\u字符串
比较,以相反顺序排序,因此如果我们有单词
c、a、ccc和cc
,它将以相反的顺序排序(正常的另一个是
a,c,cc,ccc
),因此它们将是
ccc,cc,c,a


最后在排序之后,我们需要将数据传递给
str\u replace
。这个函数需要键和值,我们没有将它们分开,因为之前我们使用
array\u combine()
创建了一个数组并对其进行排序。但是现在我们可以使用
array\u keys()
array\u values()从该数组中获取键和值
函数。

如果您只需要正数,下面的答案最好使用数组反转,如果您需要包含负数,则需要更多的条件检查问题不仅仅是数字,甚至可能是要替换的单词,即:我这里有两个单词“Anh”和“Anha”,我会将“Anh”替换为“Hello”“Anha”和“Hi”。我认为使用preg_替换为特定规则会更好。如何用图像替换单词,如果我有一个大致相似的单词数组,我正在寻找替换特定单词的方法,即:“an”将替换为“Hi”,而“Anh”将替换为“Hello”,而“Anha”将替换为“Bye”@AbuRayane你检查过这个代码了吗?它应该可以工作。对于
Anha 2 Anh 21
它会给你输出:
Hi one Bye two Hello 21
这是代码吗
$text='An 1 Anha 2 Anh 21';$numbers=array(0,1,2,10,21,'a','An','An','An','An','Anh','Anha');$letters=array('0'、'1'、'2'、'10'、'21'、'A'、'AN'、'Hi'、'Hello'、'Bye');echo str_替换($number、$letters、$text)
@AbuRayane是的,我编辑了我的答案并添加了第二个示例。我没有看到任何情况它不起作用。是吗?你测试过吗?@AbuRayane你测试过全部代码吗?看看我的答案。我在stru替换中没有使用
$numbers
$letters
。再次-仔细看看我的答案。我已经添加了完整的代码来编辑我的答案万一你误解了。
<?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);