2017-05-09 11 views
0

私は2つの配列を持っています。 1つはデータベースから来て、私はいつでも好きなものを注文することができます。
2番目のAPIはサードパーティのAPIから提供されており、注文を管理することはできません。私は、$desiredのように3つのキー(pk1pk2pk3)に基づいて違いを判断しようとしています。 pk -keysから作成される一意のキーを使用して指定されたキーの2次元PHP配列の相違

$array1=[ 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>2,"attr1"=>2,"attr2"=>3], 
]; 

$array2=[ 
    ["pk1"=>2,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk3"=>2,"pk2"=>1,"attr1"=>4,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
]; 

$desired=[ 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"array1"=>["attr1"=>1,"attr2"=>3],"array2"=>["attr1"=>1,"attr2"=>3]], 
    ["pk1"=>1,"pk2"=>2,"pk3"=>1,"array1"=>["attr1"=>3,"attr2"=>1],"array2"=>null], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>2,"array1"=>["attr1"=>2,"attr2"=>3],"array2"=>["attr1"=>4,"attr2"=>3]], 
    ["pk1"=>2,"pk2"=>2,"pk3"=>1,"array1"=>null,"array2"=>["attr1"=>3,"attr2"=>1]] 
]; 
+0

あなたは問題を詳細に説明する必要があります。コードからはっきりとわかりません。 – Steve

+0

'pk'sからユニークなキーを作成して比較してください。 –

+0

@u_mulder私は現在 '$ array [" $ arr [pk1]〜$ arr [pk2]〜$ arr [pk3] "]を使ってこれをやり始めています。 – user1032531

答えて

0

完全なソリューション、:

// delimiter for creating unique keys 
const DELIMITER = '~'; 

// source arrays 
$array1=[ 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>2,"attr1"=>2,"attr2"=>3], 
]; 

$array2=[ 
    ["pk1"=>2,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk3"=>2,"pk2"=>1,"attr1"=>4,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
]; 

// function to create new arrays with unique keys from source arrays 
function doSmth($arr) 
{ 
    $result = []; 

    foreach ($arr as $item) { 
     // new key is created via concatenating pk-keys 
     $result[$item["pk1"] . DELIMITER . $item["pk2"] . DELIMITER . $item["pk3"]] = [ 
      "attr1"=>$item["attr1"], 
      "attr2"=>$item["attr2"], 
     ]; 
    } 

    return $result; 
} 

// creating new arrays 
$narr1 = doSmth($array1); 
$narr2 = doSmth($array2); 

// target array 
$desired = []; 
foreach ($narr1 as $k => $v) { 
    // restore pk-keys from $k 
    $parts = explode(DELIMITER, $k); 
    $desired[] = [ 
     'pk1' => $parts[0], 
     'pk2' => $parts[1], 
     'pk3' => $parts[2], 
     'array1' => $v, 
     // if same key exists in `$narr2` - use it 
     'array2' => isset($narr2[$k])? $narr2[$k] : null 
    ]; 
    if (isset($narr2[$k])) { 
     // unset value from `$narr2` 
     unset($narr2[$k]); 
    } 
} 

// if something left in `$narr2` - add it to target array 
foreach ($narr2 as $k => $v) { 
    $parts = explode(DELIMITER, $k); 
    $desired[] = [ 
     'pk1' => $parts[0], 
     'pk2' => $parts[1], 
     'pk3' => $parts[2], 
     'array1' => null, 
     'array2' => $v, 
    ]; 
} 

echo'<pre>',print_r($desired),'</pre>'; 
1

u_mulder、あなたは私がそれを打ちます!私はあなたのソリューションがあなたのように機能していると仮定して、次のようにしています。

<?php 

$array1=[ 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>2,"attr1"=>2,"attr2"=>3], 
]; 

$array2=[ 
    ["pk1"=>2,"pk2"=>2,"pk3"=>1,"attr1"=>3,"attr2"=>1], 
    ["pk1"=>1,"pk3"=>2,"pk2"=>1,"attr1"=>4,"attr2"=>3], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"attr1"=>1,"attr2"=>3], 
]; 

$desired=[ 
    ["pk1"=>1,"pk2"=>1,"pk3"=>1,"array1"=>["attr1"=>1,"attr2"=>3],"array2"=>["attr1"=>1,"attr2"=>3]], 
    ["pk1"=>1,"pk2"=>2,"pk3"=>1,"array1"=>["attr1"=>3,"attr2"=>1],"array2"=>null], 
    ["pk1"=>1,"pk2"=>1,"pk3"=>2,"array1"=>["attr1"=>2,"attr2"=>3],"array2"=>["attr1"=>4,"attr2"=>3]], 
    ["pk1"=>2,"pk2"=>2,"pk3"=>1,"array1"=>null,"array2"=>["attr1"=>3,"attr2"=>1]] 
]; 
echo('$array1');print_r($array1); 
echo('$array2');print_r($array2); 
echo('$desired');print_r($desired); 

$array=[]; 
foreach($array1 as $arr) { 
    $array["$arr[pk1]~$arr[pk2]~$arr[pk3]"]=["pk1"=>$arr['pk1'],"pk2"=>$arr['pk2'],"pk3"=>$arr['pk3'],"array1"=>["attr1"=>$arr['attr1'],"attr2"=>$arr['attr2']],"array2"=>null]; 
} 
foreach($array2 as $arr) { 
    if(isset($array["$arr[pk1]~$arr[pk2]~$arr[pk3]"])) { 
     $array["$arr[pk1]~$arr[pk2]~$arr[pk3]"]['array2']=["attr1"=>$arr['attr1'],"attr2"=>$arr['attr2']]; 
    } 
    else { 
     $array[]=["pk1"=>$arr['pk1'],"pk2"=>$arr['pk2'],"pk3"=>$arr['pk3'],"array1"=>null, "array2"=>["attr1"=>$arr['attr1'],"attr2"=>$arr['attr2']]]; 
    } 
} 
$array=array_values($array); 
echo('$array');print_r($array);