2016-08-23 17 views
0

2つの配列を同じキーでマージするには、以下のPHPの値ペアが返されます。同じキー、値のペアを持つ配列をマージする方法

array:8 
    0 => array:3 
    "group" => array:2 
     "id" => 1 
     "name" => "data 1" 
    ] 
    "brief" => array:5 
    "tasks" => array:1 
    ] 
    1 => array:3 
    "group" => array:2 
     "id" => 1 
     "name" => "data 1" 
    ] 
    "brief" => array:5 
    "tasks" => array:1 
    ] 
    2 => array:3 
    3 => array:3 
    4 => array:3 
    5 => array:3 
    "group" => array:2 
     "id" => 6 
     "name" => "data 5" 
    ] 
    "brief" => array:5 
    "tasks" => array:1 
    ] 
    6 => array:3 
    "group" => array:2 
     "id" => 6 
     "name" => "data 5" 
    ] 
    "brief" => array:5 
    "tasks" => array:1 
    ] 
    "totalHours" => "31" 
] 

私は配列をマージする必要が[0]、配列[1]配列と同じ[5]及び配列[6]は、同じグループのキーと値の両方を持っているからです。私はLaravel btwを使っています。

+0

本当に重複を削除するだけですか? – tam5

+0

'array_unique($ yourArray、SORT_REGULAR) 'を呼び出すと、重複したエントリのない新しい配列が返されます。 Laravelを使用していると述べたので、この配列が作成されたときに重複が最初に作成されるのを防ぐことができるかどうかを確認する価値があります。 – tam5

+0

ちょっと重複を取り除いていますが、私の場合、私はその簡単なやりとりを保持する必要があるので、私はそれをマージする必要があります。配列[0]には、1グループ2の簡単な2つのタスクがあります。 – PenAndPapers

答えて

1

次のようなものを試すことができます。配列内のどの項目が同じグループIDを持つかを検出します。次に、これらのアイテムまたはマージしたいキーをマージします。

ここではarray_merge_recursiveを使用していますが、idフィールドとnameフィールドを配列にマージして、グループキーを置き換えます。しかし、ここで注意してください、あなたはあなたがマージしたいものをより明示的にしたいかもしれません。たぶんあなたの場合の仕事と簡単なこと。

<?php 
$items = [ 
    [ 
     'group' => [ 
      'id' => '23', 
      'name' => 'peach' 
      ], 
     'tasks' => ['foo', 'bar'] 
    ], 
    ['big', 'fat', 'mamma'], 
    [ 
     'group' => [ 
      'id' => '23', 
      'name' => 'peach' 
      ], 
     'tasks' => ['baz', 'bat'] 
    ], 
]; 

$groupIds = []; 
foreach($items as $key => $item) { 
    if(isset($item['group'])) { 
     $groupIds[$item['group']['id']][] = $key; 
    } 
} 

foreach($groupIds as $group_id => $item_keys) { 
    $merged_item = array(); 
    foreach($item_keys as $key) { 
     $merged_item = array_merge_recursive($merged_item, $items[$key]); 
     $merged_item['group'] = $items[$key]['group']; 
     unset($items[$key]); 
    } 
    array_push($items, $merged_item); 
} 

var_export($items); 

出力:

array (
    1 => 
    array (
    0 => 'big', 
    1 => 'fat', 
    2 => 'mamma', 
), 
    3 => 
    array (
    'group' => 
    array (
     'id' => '23', 
     'name' => 'peach', 
    ), 
    'tasks' => 
    array (
     0 => 'foo', 
     1 => 'bar', 
     2 => 'baz', 
     3 => 'bat', 
    ), 
), 
) 
+0

ありがとう@Progrock – PenAndPapers

0

あなたはLaravelコレクションunique methodを使用することができます。

これにより、固有のものを定義するためのキーを設定できます。

ドット構文とマージするネストされたプロパティを選択できます。すなわちgroup.id

$merged = collect($original)->unique('group.id'); 
関連する問題