合并两个具有指定索引的数组

时间:2019-02-04 08:21:15

标签: php

有两个数组,第二个数组将始终比第一个数组小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);

3 个答案:

答案 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], ['-','/','/'])
);

https://3v4l.org/F0ud8


如果数组的索引格式正确,则上述内容可以简化为:

function foo(array $p, array $q): array {
    $r = [$p[0]];

    foreach ($q as $i => $x) {
        $r[] = $x;
        $r[] = $p[$i + 1];
    }

    return $r;
}