假设我有两个相关的数组
$letters = ['a', 'b', 'c', 'd', 'e'];
$replace = [1, 5, 10, 15, 20];
和由空格分隔的一串字母。
$text = "abd cde dee ae d";
我想把连续的字母转换成它们各自的数字,把数字相加,然后用总数代替原来的字母。
使用str_replace()
是不正确的,因为值在我求和之前被压缩为字符串。
$re = str_replace($letters, $replace, $text);
echo $re; //this output:
1515 101520 152020 120 15
我实际上想要对每个"单词"的数字求和。结果应该是:
21 45 55 21 15
What I tried:
$resultArray = explode(" ", $re);
echo array_sum($resultArray).'<br />';
错误输出:
255190
编辑:我的实际数据包含阿拉伯语多字节字符。
$letters = array('ا', 'ب','ج','د' ) ;
$replace = array(1, 5, 10, 15 ) ;
$text = "جا باب جب";
将字符串转换为数组并使用array_sum
array_sum(explode(' ', $re));
编辑
对不起,误解:
$letters = array('a','b','c', 'd', 'e');
$replace = array( 1, 5, 10, 15 , 20);
$text = "abd cde dee ae d" ;
$new_array = explode(' ', $text);
$sum_array = array();
foreach ($new_array as $string)
{
$nums = str_split($string);
foreach ($nums as &$num)
{
$num = str_replace($letters, $replace, $num);
}
$sum_array[] = array_sum($nums);
}
echo implode(' ', $sum_array);
与其用数字替换字母,我建议在替换数组中一次查找一个字母:
编辑
<?php
$text = "abd cde dee ae d";
$replace = array('a' => 1, 'b' => 5, 'c' => 10, 'd' => 15, 'e' => 20);
$letters = str_split($text);
$sums = array(0);
foreach ($letters as $letter) {
// Add a new element to the sum array.
if ($letter == ' ') {
$sums[] = 0;
} else {
$sums[count($sums) - 1] += $replace[$letter];
}
}
echo implode(" ", $sums);
?>
下面是一个工作示例:http://codepad.org/Cw71zuKD
因为翻译字母序列后的求和结果意味着用作输出字符串中的替换文本,所以我发现preg_replace_callback()
是封装和传递所需逻辑的合适工具。
- 隔离一个字母子串
- 将每组字母拆分为单个字符数组
- 执行必要的整数值转换
- 对数字数组求和
- 将原始子字符串替换为求和值
- 重复直到所有子字符串被替换
代码(演示):
$letters = ['a','b','c', 'd', 'e'];
$replace = [1, 5, 10, 15 , 20];
$text = "abd cde dee ae d";
echo preg_replace_callback(
'/[a-e]+/',
fn($m) => array_sum(
str_replace(
$letters,
$replace,
str_split($m[0])
)
),
$text
);
输出:21 45 55 21 15
对于多字节处理:(Demo)
$letters = array('ا', 'ب','ج','د' ) ;
$replace = array(1, 5, 10, 15 ) ;
$text = "جا باب جب";
echo preg_replace_callback(
'/'S+/u',
fn($m) => array_sum(
str_replace(
$letters,
$replace,
mb_str_split($m[0])
)
),
$text
);
输出;
11 11 15