我有一个包含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 ++),但不能使用包含所有先前值的当前值。
答案 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的默认值传递语义。