有两个数组,第二个数组将始终比第一个数组小1。第一个数组包含数字,第二个数组包含数学运算符。
df1 <- data.frame(JANUARY = c("D-150", "D-90", "D-60", "D-30"),
X2016 = c(0.24, 0.5, 0.63, 0.76),
X2017 = c(0.32, 0.45, 0.6, 0.79),
X2018 = c(0.2, 0.4, 0.61, 0.82),
X2019 = c(0.21, 0.35, 0.63, 0.85))
我编写的代码仅在此测试用例上有效,但是当我增加其中的元素数量时。它失败了。
$arr1 = [210,11,12];
$arr2 = ['-','/'];
到目前为止我尝试过的代码。
$arr1 = [210,11,12,12];
$arr2 = ['-','/','/'];
预期结果将
$arr1 = [210,11,12];
$arr2 = ['-','/'];
$arr3 = [];
for($i=0;$i<count($arr1);$i++){
if($i == 0){
$arr3[] = $arr1[0];
}
if ($i % 2 != 0) {
$arr3[] = $arr1[$i];
}
else {
if($i < (count($arr2)-1)){
$arr3[] = $arr2[$i];
}else{
$arr3[] = $arr2[$i-1];
}
}
}
array_push($arr3,end($arr1));
print_r($arr3);
答案 0 :(得分:2)
循环第一个数组并使用$key =>
。
然后,您在循环中构建新数组,如果$arr2
的值具有相同的键,则将其添加到$arr1
值之后。
$arr1 = [210,11,12,12];
$arr2 = ['-','/','/'];
foreach($arr1 as $key => $val){
$arr3[] = $val;
if(isset($arr2[$key])) $arr3[] = $arr2[$key];
}
var_dump($arr3);
//[210, -, 11, /, 12, /, 12]
答案 1 :(得分:2)
您可以将两个数组混合在一起,方法是使用array_map
将列转换为行,然后合并行。
$arr3 = array_merge(...array_map(null, $arr1, $arr2));
array_pop($arr3);
array_map(null, $arr1, $arr2)
表达式将得出
[[210, '/'], [11, '/'], [12, '/'], [12, null]]
然后,array_merge(...)
将所有内部数组组合在一起,成为最终结果。
array_pop
将删除尾随的null
,这是因为两个数组的大小不均,但是如果最终要内推并以数学表达式输出结果,您不需要这样做,因为无论如何它都不会出现。实际上,如果这是目标,则只需将implode
直接添加到上面的表达式中即可。
echo implode(' ', array_merge(...array_map(null, $arr1, $arr2)));
答案 2 :(得分:1)
正如您所说,第二个数组总是比一个元素大,那么这将是一种简单的方法:
function foo(array $p, array $q): array {
$r = [array_shift($p)];
foreach ($q as $x) {
$r[] = $x;
$r[] = array_shift($p);
}
return $r;
}
print_r(
foo([210,11,12], ['-', '/'])
);
print_r(
foo([210,11,12,12], ['-','/','/'])
);
如果数组的索引格式正确,则上述内容可以简化为:
function foo(array $p, array $q): array {
$r = [$p[0]];
foreach ($q as $i => $x) {
$r[] = $x;
$r[] = $p[$i + 1];
}
return $r;
}