假设我有一个如下数字:
$number = "20160513123"
所以我想做的是, 从2开始,对于每个第三个数字,我想要乘以并找到总和。 所以基本上我想从字符串中得到数字2,6,1,2 并将每个数乘以3,然后计算所有乘法的总和。 像这样:
2 * 3,
6 * 3,
1 * 3,
2 * 3,
然后我想得到以上所有的总和。如何使用PHP?
答案 0 :(得分:3)
您可以使用range
功能逐步浏览字符:
$number = "20160513123";
$sum = 0;
foreach (range(0, strlen($number), 3) as $i) {
$sum += 3*$number[$i];
}
echo $sum;
输出:
33
如果您喜欢函数式编程,那么这可能符合您的喜好:
$sum = 3 * array_sum(array_map(
function($i) use ($number) { return $number[$i]; },
range(0, strlen($number), 3)
));
或者,使用str_split
,您可以获得3个字符的块:
$sum = array_sum(array_map(
function($s) { return 3*$s[0]; },
str_split($number, 3)
));
注意:请注意,您可以将每个数字分别乘以3,也可以只计算总和。
最后一种选择。它使用array_chunk
和array_column
来过滤掉所需的数字(似乎PHP具有大多数功能):
$sum = 3 * array_sum(array_column(array_chunk(str_split($number), 3), 0));
选择你的选择; - )
答案 1 :(得分:1)
(你不会为这个问题找到一个较小的单行):
echo array_sum(preg_split('/.\K..?/',$number))*3;
这会在第一个字符后跟$number
每2(或1)个字符爆炸,将剩余数字加起来并乘以它们。简直太棒了!
CasimiretHippolyte之前的解决方案:
if(preg_match_all('/..\K./',"00$number",$matches)){
echo array_sum($matches[0])*3;
}
虽然它需要对字符串进行左填充,但与我的解决方案相比,此方法使用更短/更简单的正则表达式并生成更精简的$matches
数组:
mickmackusa的解决方案:
if(preg_match_all("/(\d)(?:\d\d|\d$|$)/",$number,$matches)){
echo array_sum($matches[1])*3;
}
我的正则表达式匹配所有后跟的数字:2位数, 1位数字行尾或行尾。此方法在可能的情况下逐步超过非捕获组数字,因此仅捕获第1,第4,第7等。
以上输出的所有代码:
33
答案 2 :(得分:1)
使用str_split函数的解决方案(获取数字数组):
$number = "20160513123";
$total_sum = 0;
foreach (str_split($number) as $k => $n) {
if ($k % 3 == 0) $total_sum += $n * 3; // considering each third digit
}
print_r($total_sum); // 33