通过将值增加一个增量来创建列表,包括previous


Create list by adding a value in by one increment, including previous

我有一个包含x个值的数组,我需要创建一个包含第一个元素的新数组,然后是第一个元素,然后是第二个元素,等等:

$start = Array ( 
         [0] => pattern_01 
         [1] => pattern_02  
         [2] => pattern_03  
         [3] => pattern_04  
         [4] => pattern_05 
)

包含与

结构类似的新数组
$new = Array ( 
         [0] => [pattern_01]
         [1] => [pattern_01][pattern_02]
         [2] => [pattern_01][pattern_02][pattern_03]
         [3] => [pattern_01][pattern_02][pattern_03][pattern_04]
         [4] => [pattern_01][pattern_02][pattern_03][pattern_04][pattern_05]
)

我可以使用变量增加($i++),但不知道如何去添加当前值,包括所有以前的

您在这里寻找的技术是使用累加器变量来跟踪您在迭代数组时所看到的内容。

<?php
$start = array('a', 'b', 'c', 'd', 'e', 'f');
$end = array();
$accumulator = '';
foreach($start as $value) {
    $accumulator .= $value;
    $end[] = $accumulator;
}
var_dump($end);
输出:

array(6) {
  [0]=>
  string(1) "a"
  [1]=>
  string(2) "ab"
  [2]=>
  string(3) "abc"
  [3]=>
  string(4) "abcd"
  [4]=>
  string(5) "abcde"
  [5]=>
  string(6) "abcdef"
}

这种类型的数组->数组转换非常适合array_map内置:

<?php
$start = array('a', 'b', 'c', 'd', 'e', 'f');
$end = array_map(
    function($val) {
        static $accumulator = '';
        $accumulator .= $val;
        return $accumulator;
    },
    $start
);

也有可能滥用array_reduce来获得相同的结果:

<?php
$start = array('a', 'b', 'c', 'd', 'e', 'f');
$end = array();
array_reduce(
    $start,
    function($accumulator, $val) use (&$end) {
        $accumulator .= $val;
        $end[] = $accumulator;
        return $accumulator;
    },
    ''
);

你可以使用PHP的array_walk来修改原来的数组,如果你不需要保留原来的地方,因为其他原因:

<?php
$start = array('a', 'b', 'c', 'd', 'e', 'f');
$accumulator = '';
array_walk(
    $start,
    function(&$val, $key, &$accumulator) {
        $accumulator .= $val;
        $val = $accumulator;
    },
    $accumulated
);

注意,在一些回调函数中使用&来通过引用传递变量,而不是使用PHP默认的按值传递语义。