Merging arrays based on a value of the key

前端 未结 9 1309
予麋鹿
予麋鹿 2020-12-19 09:03

I have two arrays of arrays that have an id key, and I\'d like to merge the data together based on that array\'s key and key value. The data would look somethin

相关标签:
9条回答
  • 2020-12-19 09:43

    I'd suggest using laravel's collections, since this question has the laravel tag.

    $color = collect(
        ['id' => 1, 'color' => 'red'],
        ['id' => 2, 'color' => 'green'],
        ['id' => 3, 'color' => 'blue']
    );
    
    $size = collect(
        ['id' => 1, 'size' => 'SM'],
        ['id' => 2, 'size' => 'XL'],
        ['id' => 3, 'size' => 'MD'],
        ['id' => 4, 'size' => 'LG']
    );
    
    $combined = $color->merge($size);
    
    0 讨论(0)
  • 2020-12-19 09:50

    Pure php solution is to use array_replace_recursive like this:

    array_replace_recursive(
      array_combine(array_column($color, "id"), $color),
      array_combine(array_column($size, "id"), $size)
    );
    

    You should notice that array_replace_recursive merge arrays by keys. So, if you get such data from database:

    $color = [
        ['id' => 1, 'color' => 'red'],
        ['id' => 2, 'color' => 'red']
    ];
    
    $size = [
        ['id' => 2, 'size' => 'SM']
    ];
    

    array_replace_recursive will return corrupted merge:

    $combined = [
        ['id' => 2, 'color' => 'red', 'size' => 'SM'],
        ['id' => 2, 'color' => 'red']
    ];
    

    The solution is to combine array_replace_recursive with array_column and array_combine for merging arrays by their's id field:

    array_replace_recursive(
      array_combine(array_column($color, "id"), $color),
      array_combine(array_column($size, "id"), $size)
    );
    

    array_combine(array_column($color, "id"), $color) creates associative array with id as keys.

    So, in your case it will return:

    $combined = [
        1 => ['id' => 1, 'color' => 'red', 'size' => 'SM'],
        2 => ['id' => 2, 'color' => 'green', 'size' => 'XL'],
        3 => ['id' => 3, 'color' => 'blue', 'size' => 'MD'],
        4 => ['id' => 4, 'size' => 'LG'],
    ];
    
    0 讨论(0)
  • 2020-12-19 09:53

    You can use array_replace_recursive to merge the arrays in your particular situation.

    $color = array(
        array('id' => 1, 'color' => 'red'),
        array('id' => 2, 'color' => 'green'),
        array('id' => 3, 'color' => 'blue'),
    );
    
    $size = array(
        array('id' => 1, 'size' => 'SM'),
        array('id' => 2, 'size' => 'XL'),
        array('id' => 3, 'size' => 'MD'),
        array('id' => 4, 'size' => 'LG'),
    );
    
    $merged = array_replace_recursive($color, $size);
    

    Output:

    array(4) {
      [0]=>
      array(3) {
        ["id"]=>
        int(1)
        ["color"]=>
        string(3) "red"
        ["size"]=>
        string(2) "SM"
      }
      [1]=>
      array(3) {
        ["id"]=>
        int(2)
        ["color"]=>
        string(5) "green"
        ["size"]=>
        string(2) "XL"
      }
      [2]=>
      array(3) {
        ["id"]=>
        int(3)
        ["color"]=>
        string(4) "blue"
        ["size"]=>
        string(2) "MD"
      }
      [3]=>
      array(2) {
        ["id"]=>
        int(4)
        ["size"]=>
        string(2) "LG"
      }
    }
    

    Note: I used the traditional array layout because my PHP version won't support the new one yet :)

    Second option

    You can also use array_map. This will let you add as much arrays as you want with a little tweaking.

    $merged = array_map(function ($c, $s) {
        return array_merge($c, $s);
    }, $color, $size);
    
    var_dump($merged); // See output above
    
    0 讨论(0)
提交回复
热议问题