2017-03-27 2 views
1

3 개의 값 (group_id, user_id, unit_id)이 일치하는 결합을 기반으로 두 개의 배열이 있습니다. 이 값이 하나의 배열에는 나타나지만 다른 배열에는 나타나지 않으면 값이 없다는 것을 나타 내기 위해 문자열을 삽입하고 싶습니다.다차원 배열 결합

배열 1 :

Array 
(
    [0] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 21382 
      [amount] => 500 
      [type] => A 
     ) 

    [1] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 24255 
      [amount] => 300 
      [type] => A 
     ) 

    [2] => Array 
     (
      [group_id] => 1 
      [user_id] => 4 
      [unit_id] => 21382 
      [amount] => 50 
      [type] => A 
     ) 

    [3] => Array 
     (
      [group_id] => 1 
      [user_id] => 4 
      [unit_id] => 24255 
      [amount] => 67 
      [type] => A 
     ) 
) 

배열 2 :

Array 
(
    [0] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 21382 
      [amount] => 100 
      [type] => B 
     ) 

    [1] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 24255 
      [amount] => 82 
      [type] => B 
     ) 
) 

원하는 결과 :

Array 
(
    [0] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 21382 
      [A] => 500 
      [B] => 100 
     ) 

    [1] => Array 
     (
      [group_id] => 1 
      [user_id] => 7 
      [unit_id] => 24255 
      [A] => 300 
      [B] => 82 
     ) 
    [2] => Array 
     (
      [group_id] => 1 
      [user_id] => 4 
      [unit_id] => 21382 
      [A] => 50 
      [B] => undefined 
     ) 

    [3] => Array 
     (
      [group_id] => 1 
      [user_id] => 4 
      [unit_id] => 24255 
      [A] => 67 
      [B] => undefined 
     ) 
) 

나는 부분적인 결과를 얻기 위해 관리하는 foreach 루프를 사용하지만이 '아무튼 값이 하나의 배열에 나타나고 다른 배열에 나타나지 않는 경우를 설명합니다.

foreach ($array_1 as &$arr1) { 
    foreach ($array_2 as $arr2) { 
     if ($arr1['group_id'] == $arr2['group_id'] && $arr1['user_id'] == $arr2['user_id'] && $arr1['unit_id'] == $arr2['unit_id']) { 
      $newArr[] = array('group_id'=>$arr1['group_id'], 'user_id'=>$arr1['user_id'], 'unit_id'=>$arr1['unit_id'], 'group_id'=>$arr1['group_id'], 'A'=>$arr1['amount'], 'B'=>$arr2['amount']); 
      break; 
     } 
    } 
} 

답변

2

내 시도, 당신은 array_merge 명령에 추가적인 배열을 추가 할 수 있습니다. 또는 유형을 쉽게 추가 할 수 있으며 유형을 소스 배열 내에서 혼합 할 수도 있습니다.

$arr1 = array(
     array(
      'group_id' => 1, 
      'user_id' => 7, 
      'unit_id' => 21382, 
      'amount' => 500, 
      'type' => 'A', 
     ), 
     array(
      'group_id' => 1, 
      'user_id' => 7, 
      'unit_id' => 24255, 
      'amount' => 300, 
      'type' => 'A', 
     ), 
     array(
      'group_id' => 1, 
      'user_id' => 4, 
      'unit_id' => 21382, 
      'amount' => 50, 
      'type' => 'A', 
     ), 
     array(
      'group_id' => 1, 
      'user_id' => 4, 
      'unit_id' => 24255, 
      'amount' => 67, 
      'type' => 'A', 
     ), 
    ); 

    $arr2 = array(
     array(
      'group_id' => 1, 
      'user_id' => 7, 
      'unit_id' => 21382, 
      'amount' => 100, 
      'type' => 'B', 
     ), 
     array(
      'group_id' => 1, 
      'user_id' => 7, 
      'unit_id' => 24255, 
      'amount' => 82, 
      'type' => 'B', 
     ), 
    ); 

    $arrMerged = array_merge($arr1, $arr2); 
    $desired = array(); 

    foreach ($arrMerged as $key => $val) { 
     $retKey = false; 
     foreach($desired as $desKey => $desVal) { 
      if($desVal['group_id'] == $val['group_id'] 
      && $desVal['user_id'] == $val['user_id'] 
      && $desVal['unit_id'] == $val['unit_id'] 
      ) { 
       $retKey = $desKey; 
       break; 
      } 
     } 
     if($retKey === false) { 
      $desired[] = array(
       'group_id' => $val['group_id'], 
       'user_id' => $val['user_id'], 
       'unit_id' => $val['unit_id'], 
       'A' => ($val['type'] == 'A' ? $val['amount'] : 'undefined'), 
       'B' => ($val['type'] == 'B' ? $val['amount'] : 'undefined'), 
      ); 
     } else { 
      $desired[$retKey][$val['type']] = $val['amount']; 
     } 
    } 

    var_dump($desired); 
+0

이 작업을 통해 많은 시간을 절약 할 수있었습니다. 감사합니다. – user6368630

0

array1에는 항상 A 유형이 있고 array2에는 유형 B 값/금액이 있다고 가정하면 코드 아래에 원하는 출력이 제공됩니다.

$array1 = array(
'0' => array('group_id' => 1,'user_id' => 7,'unit_id' => 21382, 'amount' => 500,'type' => 'A'), 
'1' => array ('group_id' => 1, 'user_id' => 7,'unit_id' => 24255,'amount' => 300,'type' => 'A'), 
'2' => array('group_id' => 1, 'user_id' => 4, 'unit_id' => 21382, 'amount' => 50,'type' => 'A'), 
'3' => array('group_id' => 1,'user_id' => 4,'unit_id' => 24255, 'amount' => 67, 'type' => 'A') 
); 

$array2 = array(
    '0' => array('group_id' => 1,'user_id' => 7,'unit_id' => 21382,'amount' => 100,'type' => 'B',), 
    '1' => array('group_id' => 1,'user_id' => 7,'unit_id' => 24255,'amount' => 82,'type' => 'B',) 
); 
// define an array 
$new_array = array(); 
// loop first array 
foreach($array1 as $key=>$value){ 
    // generate unique key 
    $unique_key = $value['group_id'].'_'.$value['user_id'].'_'.$value['unit_id']; 
    // loop the second array 
    foreach($array2 as $k=>$v){ 
     // check the condition 
     if ($value['group_id'] == $v['group_id'] && $value['user_id'] == $v['user_id'] && $value['unit_id'] == $v['unit_id']) { 
      // generate array 
      $new_array[$unique_key]=array('group_id'=>$value['group_id'], 
      'user_id'=>$value['user_id'], 
      'unit_id'=>$value['unit_id'], 
      $value['type']=>$value['amount'], 
      $v['type'] => $v['amount'] 
      ) ; 
     }else{ 
      $new_array[$unique_key]=array(
       'group_id'=>$value['group_id'], 
      'user_id'=>$value['user_id'], 
      'unit_id'=>$value['unit_id'], 
      $value['type']=>$value['amount'], 
      $v['type'] => 'Undefined' 
      ) ; 
     } 
    } 
} 
// returns indexed array with values 
$final_array = array_values($new_array); 
print_r($final_array); 

을 넣어 :

Array 
(
[0] => Array 
    (
     [group_id] => 1 
     [user_id] => 7 
     [unit_id] => 21382 
     [A] => 500 
     [B] => 100 
    ) 

[1] => Array 
    (
     [group_id] => 1 
     [user_id] => 7 
     [unit_id] => 24255 
     [A] => 300 
     [B] => 82 
    ) 

[2] => Array 
    (
     [group_id] => 1 
     [user_id] => 4 
     [unit_id] => 21382 
     [A] => 50 
     [B] => Undefined 
    ) 

[3] => Array 
    (
     [group_id] => 1 
     [user_id] => 4 
     [unit_id] => 24255 
     [A] => 67 
     [B] => Undefined 
    ) 

) 
0

중첩 루프는 상당히 비싼 O (n2) 복잡성을 초래합니다.

병합 키 (아래의 코드에서 $uKey)를 사용하여 배열을 인덱싱하는 경우 선형 O (n) 복잡도로 동일한 작업을 수행 할 수 있습니다.

/** 
* build index 
* 
* @var array $index cumulative index 
* @var array $array array to add to index 
* @var array $uKey array of unique key names 
* @var array $template array of 'undefined' elements 
* @var string $char key to hold 'amount' value from $array 
*/ 
function index(&$index, $array, $uKey, $template, $char) { 
    foreach($array as $a) { 
     $key = json_encode(array_intersect_key($a, $uKey)); 
     $val = isset($index[$key]) ? $index[$key] : []; 
     $index[$key] = array_merge($template, $val, [$char => $a['amount']]); 
    }  
} 

// init empty index 
$index = []; 

// define vector 
$uKey = array_flip(['group_id', 'user_id', 'unit_id']); 

// define template 
$template = ['A' => 'undefined', 'B' => 'undefined']; 

// add arrays to index 
index($index, $array1, $uKey, $template, 'A'); 
index($index, $array2, $uKey, $template, 'B'); 

// format index to reqquested output 
$result = []; 
foreach($index as $key=>$val) { 
    $result[] = array_merge(json_decode($key, true), $val); 
} 
print_r($result)