通过添加一个增量值(包括之前的增量)来创建列表

时间:2015-10-22 01:19:29

标签: php

我有一个包含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 ++),但不能使用包含所有先前值的当前值。

1 个答案:

答案 0 :(得分:0)

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

<?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"
}

这种类型的数组 - &gt;数组转换非常适合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
);

注意在某些回调函数中使用&来传递变量by reference,而不是使用PHP的默认值传递语义。

相关问题