给出一个数字,foreach第三位做某事

时间:2017-03-25 15:35:27

标签: php string foreach sum

假设我有一个如下数字:

$number = "20160513123"

所以我想做的是, 从2开始,对于每个第三个数字,我想要乘以并找到总和。 所以基本上我想从字符串中得到数字2,6,1,2 并将每个数乘以3,然后计算所有乘法的总和。 像这样:

2 * 3, 
6 * 3,
1 * 3,
2 * 3,

然后我想得到以上所有的总和。如何使用PHP?

3 个答案:

答案 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_chunkarray_column来过滤掉所需的数字(似乎PHP具有大多数功能):

$sum = 3 * array_sum(array_column(array_chunk(str_split($number), 3), 0));

选择你的选择; - )

答案 1 :(得分:1)

CasimiretHippolyte微小的单线

(你不会为这个问题找到一个较小的单行):

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