代码之家  ›  专栏  ›  技术社区  ›  maryyyyyyy

使用数组拼接以外的其他方法组合两个数组

php
  •  0
  • maryyyyyyy  · 技术社区  · 6 年前

    所以我有两组数组:

    $a = [
        [
          'position' => 0,
          'color'    => 'violet'
        ],
        [
          'position' => 2,
          'color'    => 'red'
        ],
        [
          'position' => 5,
          'color'    => 'green'
        ],
    ];
    
    $b = [
        [
          'color' => 'yellow'
        ],
        [
          'color' => 'orange'
        ],
        [
          'color' => 'pink'
        ],
        [
          'color' => 'blue'
        ],
    ];
    

    我想展示的是这样的东西:

    array(7) {
      [0]=>
      array(1) {
        ["color"]=>
        string(6) "violet"
      }
      [1]=>
      array(1) {
        ["color"]=>
        string(6) "yellow"
      }
      [2]=>
      array(1) {
        ["color"]=>
        string(3) "red"
      }
      [3]=>
      array(1) {
        ["color"]=>
        string(6) "orange"
      }
      [4]=>
      array(1) {
        ["color"]=>
        string(4) "pink"
      }
      [5]=>
      array(1) {
        ["color"]=>
        string(5) "green"
      }
      [6]=>
      array(1) {
        ["color"]=>
        string(4) "blue"
      }
    }
    

    我正在使用 array_splice 它确实可以工作,但是每当有大量数据的时候,它就非常慢。
    阵列拼接

    foreach($a as $val) {
        array_splice($b, (int) $val['position'], 0, [['color' => $val['color']]]);
    }
    

    所以我想问的是,是否有一个PHP函数来实现这一点,或者有任何其他方法来快速实现它?

    任何帮助或建议将不胜感激!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Andreas    6 年前

    此方法使用$a获取“start”,并使用array\u列获取 [pos => color]

    然后我循环这个数组以查看是否有缺少的键,如果有缺少的键,请从$b中添加一项,否则请从 [post => color] [['color' => color]]

    $pos = array_column($a, "color", "position");
    
    $count = count($pos) + count($b);
    
    for($i=0; $i<$count-1; $i++){
        if(!isset($pos[$i])){
            $pos[$i] = array_splice($b, 0, 1);
        }else{
            $pos[$i] = [$pos[$i]];
        }
    }
    ksort($pos);
    
    var_dump($pos);
    

    相同的代码,但没有数组拼接。
    使用计数器知道从$b中选择什么项目。

    $pos = array_column($a, "color", "position");
    
    $count = count($pos) + count($b);
    $j = 0;
    
    for($i=0; $i<$count-1; $i++){
        if(!isset($pos[$i])){
            $pos[$i] = $b[$j];
            $j++;
        }else{
            $pos[$i] = [$pos[$i]];
        }
    }
    ksort($pos);
    
    var_dump($pos);
    

    https://3v4l.org/3uPM3

    但这需要索引$b。

        2
  •  1
  •   Nigel Ren    6 年前

    这将两个数组循环在一起,根据插入的位置检查输出的项数 $a $b . 我用 ?? $index + 1 在测试中,如果您在 一美元 ,这将始终与 $index + 1 总是失败的。

    十亿美元 (这是我最初的错误)。。。

    $acurrent = 0;
    $output = [];
    $outputCount = 0;
    foreach ( $b as $bStart )   {
        if ( $outputCount == ($a[$acurrent]['position'] ?? $index + 1) )   {
            $output[] = ['color' => $a[$acurrent]['color']];
            $outputCount++;
            $acurrent++;
        }
        $output[] = $bStart;
        $outputCount++;
    }
    
        3
  •  1
  •   Sougata Bose    6 年前

    这也应该有帮助-

    $limit = count($a) + count($b); // get the total number of elements to loop
    $new = [];
    // Extract positions from first array for checks
    $positions = array_column($a, 'color', 'position');
    for ($i = 0; $i < $limit; $i++) {
        $new[]['color'] = isset($positions[$i]) ? $positions[$i] : array_shift($b)['color'];
    }
    
        4
  •  0
  •   HarisH Sharma    6 年前

    foreach ($a as &$col) {
        $b[] = array('color' => $col['color']);
    }
    
    print_r($b);
    

    https://paiza.io/projects/RlMs11FHx1DpA6N43Da8dg

    推荐文章