合并两个阵列具有指定索引

问题描述 投票:1回答:3

有两个阵列,第二阵列将总是从第一阵列被1小。第一阵列包含数字和第二阵列包含数学运算符。

 $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);

预期的结果将是

$arr3 = [210,'-',11,'/','12','/','12']
php
3个回答
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;
}

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这是因为两个数组的大小不均的存在,但如果你打算结束这个爆,输出的结果作为一个数学表达式,你不需要做,因为这韩元“T露面呢。事实上,如果是这样的目标,你可以直接添加implode上述表达。

echo implode(' ', array_merge(...array_map(null, $arr1, $arr2)));

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]
© www.soinside.com 2019 - 2024. All rights reserved.