2016-05-20 10 views
3

Ich habe zwei Arrays. Und ich möchte sie auf dem gleichen Schlüssel UND Wert zusammenführen. Wenn sie die gleichen ur_user_id haben, werden sie zusammengeführt. array2 liefert nur einige zusätzliche Daten für array1, also die new_array.length = array1.length. array1 erhält nur die zusätzlichen Daten von array2.PHP verschmelzen zwei Arrays auf dem gleichen Schlüssel UND Wert

$array1 =  
    array(
     array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA'), 
     array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB'), 
     array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC'), 
    ); 
$array2 = 
    array(
     array('ur_user_id' => 5,'ur_code' => 'EE','ur_user_role' => 'testE'), 
     array('ur_user_id' => 4,'ur_code' => 'DD','ur_user_role' => 'testD'), 
     array('ur_user_id' => 6,'ur_code' => 'FF','ur_user_role' => 'testF'), 
     array('ur_user_id' => 3,'ur_code' => 'CC','ur_user_role' => 'testC'), 
     array('ur_user_id' => 1,'ur_code' => 'AA','ur_user_role' => 'testA'), 
     array('ur_user_id' => 2,'ur_code' => 'BB','ur_user_role' => 'testB'), 
    );  

Dann muss das neue Array so aussehen. Es hat beide Werte von array1 und array2.

$new_array =  
    array(
     array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA','ur_code' => 'AA','ur_user_role' => 'testA'), 
     array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB','ur_code' => 'BB','ur_user_role' => 'testB'), 
     array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC','ur_code' => 'CC','ur_user_role' => 'testC'), 
    ); 

Die array1.length ist immer kleiner oder gleich array2.length nie größer. Und die Reihenfolge beider Arrays wird nicht immer geordnet. Ich habe die Funktion ausprobiert, die ich hier irgendwo gefunden habe, aber es funktioniert nicht für mich und ich bin nicht wirklich gut mit Loops.

function merge_common_keys(){ 
    $arr = func_get_args(); 
    $num = func_num_args(); 

    $keys = array(); 
    $i = 0; 
    for ($i=0; $i<$num; ++$i){ 
     $keys = array_merge($keys, array_keys($arr[$i])); 
    } 
    $keys = array_unique($keys); 

    $merged = array(); 

    foreach ($keys as $key){ 
     $merged[$key] = array(); 
     for($i=0; $i<$num; ++$i){ 
      $merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null; 
     } 
    } 
    return $merged; 
} 

Basierend auf den angegebenen Arrays ist das Ergebnis wie folgt. Es verschmilzt nur mit demselben Schlüssel.

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [ur_user_id] => 1 
        [ur_fname] => PerA 
        [ur_lname] => SonA 
       ) 

      [1] => Array 
       (
        [ur_user_id] => 5 
        [ur_code] => AA-BB-CC 
        [ur_user_role] => testE 
       ) 

     ) 
+0

@NareshKumar, die auf demselben Schlüssel ist, nicht den Wert innerhalb der Taste. – iamdevlinph

+0

Werfen Sie einen Blick auf meine Antwort und lassen Sie es mich wissen. –

Antwort

2

diesen Code ausprobieren, es könnte Ihnen helfen, dann ist es kurz und ohne durchqueren Schleifen:

usort($array2,function($a,$b){ 
     return strnatcmp($a['ur_user_id'],$b['ur_user_id']); 
    }); 
    $array3 = array_replace_recursive($array1, $array2); 

    $result = array_uintersect($array3,$array1,function($a,$b){ 
     return strnatcmp($a['ur_user_id'],$b['ur_user_id']); 
    }); 
    print_r($result); 

Ausgabe

Array 
(
    [0] => Array 
     (
      [ur_user_id] => 1 
      [ur_fname] => PerA 
      [ur_lname] => SonA 
      [ur_code] => AA 
      [ur_user_role] => testA 
     ) 

    [1] => Array 
     (
      [ur_user_id] => 2 
      [ur_fname] => PerB 
      [ur_lname] => SonB 
      [ur_code] => BB 
      [ur_user_role] => testB 
     ) 

    [2] => Array 
     (
      [ur_user_id] => 3 
      [ur_fname] => PerC 
      [ur_lname] => SonC 
      [ur_code] => CC 
      [ur_user_role] => testC 
     ) 

) 

Und hier ist Demo

0

Sie gehen besser mit diesem:

Working Example

$ids = array(); 
$out = array(); 
foreach($array1 as $key => $value){ 
    if(isset($array2[$key])) 
     $out[$key][] = $array2[$key]; 
    $out[$key][] = $value; 
    $ids[] = $array2[$key]['ur_user_id']; 
} 

foreach($array2 as $key => $val){ 
    if(!in_array($val['ur_user_id'], $ids)) 
     $out[$key][] = $array2[$key]; 
} 
+0

Es hat nicht beide Werte von 'array1' und' array2'. Nach dem Zusammenführen muss es so aussehen: 'array ('ur_user_id' => 1, 'ur_fname' => 'PerA', 'ur_lname' => 'SonA', 'ur_code' => 'AA', 'ur_user_role' => 'testA') ' – iamdevlinph

+0

Also müssen Sie den Index anpassen ??? Also was ist mit dem Rest des Elements von 'array2' ??? –

+0

Das 'array2' bietet einige zusätzliche Informationen für' array1'. Die Basis dafür ist nur das 'array1'. – iamdevlinph

1

Try this:

<?php 

$array1 =  
    array(
     array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA'), 
     array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB'), 
     array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC'), 
    ); 
$array2 = 
    array(
     array('ur_user_id' => 5,'ur_code' => 'EE','ur_user_role' => 'testE'), 
     array('ur_user_id' => 4,'ur_code' => 'DD','ur_user_role' => 'testD'), 
     array('ur_user_id' => 6,'ur_code' => 'FF','ur_user_role' => 'testF'), 
     array('ur_user_id' => 3,'ur_code' => 'CC','ur_user_role' => 'testC'), 
     array('ur_user_id' => 1,'ur_code' => 'AA','ur_user_role' => 'testA'), 
     array('ur_user_id' => 2,'ur_code' => 'BB','ur_user_role' => 'testB'), 
    ); 


$result = array(); 

$userIdsFromArray1 = array_column($array1, 'ur_user_id'); 


foreach($array2 as $subarray) 
{ 
    if(in_array($subarray['ur_user_id'], $userIdsFromArray1)) 
    { 
     $result[] = array_merge($subarray, getDataFromArray1ByUserId($array1, $subarray['ur_user_id'])); 
    } 
} 


function getDataFromArray1ByUserId($array1, $userId) 
{ 
    foreach($array1 as $key => $data) 
    { 
     if($data['ur_user_id'] == $userId) 
      return $data; 
    } 

    return array(); 
} 

usort($result,function($a,$b){ 
    return strnatcmp($a['ur_user_id'],$b['ur_user_id']); 
}); 

print_r($result); 

Arbeitsbeispiel: CLICK!

1

Versuchen Sie diesen Code drei Zeilen in foreach Schleife wie folgt:

$array1 =  
    array(
     array('ur_user_id'=> 1,'ur_fname'=>'PerA','ur_lname'=>'SonA'), 
     array('ur_user_id'=> 2,'ur_fname'=>'PerB','ur_lname'=>'SonB'), 
     array('ur_user_id'=> 3,'ur_fname'=>'PerC','ur_lname'=>'SonC'), 
    ); 
$array2 = 
    array(
     array('ur_user_id' => 5,'ur_code' => 'EE','ur_user_role' => 'testE'), 
     array('ur_user_id' => 4,'ur_code' => 'DD','ur_user_role' => 'testD'), 
     array('ur_user_id' => 6,'ur_code' => 'FF','ur_user_role' => 'testF'), 
     array('ur_user_id' => 3,'ur_code' => 'CC','ur_user_role' => 'testC'), 
     array('ur_user_id' => 1,'ur_code' => 'AA','ur_user_role' => 'testA'), 
     array('ur_user_id' => 2,'ur_code' => 'BB','ur_user_role' => 'testB'), 
    ); 

$newArray =array(); 

foreach($array1 as $key => $val) 
{ 
    $ids = array_map(function ($ar) {return $ar['ur_user_id'];}, $array2); //get the all the user ids from array 2 
    $k = array_search($val['ur_user_id'],$ids); // find the key of user id in ids array 
    $newArray[] = array_merge($array1[$key],$array2[$k]); /// merge the first array key with second 
} 

echo "<pre>"; print_r($newArray); 
Diese

geben Ihnen:

(
    [0] => Array 
     (
      [ur_user_id] => 1 
      [ur_fname] => PerA 
      [ur_lname] => SonA 
      [ur_code] => AA 
      [ur_user_role] => testA 
     ) 

    [1] => Array 
     (
      [ur_user_id] => 2 
      [ur_fname] => PerB 
      [ur_lname] => SonB 
      [ur_code] => BB 
      [ur_user_role] => testB 
     ) 

    [2] => Array 
     (
      [ur_user_id] => 3 
      [ur_fname] => PerC 
      [ur_lname] => SonC 
      [ur_code] => CC 
      [ur_user_role] => testC 
     ) 

) 

LIVE DEMO

Verwandte Themen