2016-08-11 6 views
0

私は$ oldと$ newという2つの多次元配列を持っています。私は2つの配列を比較し、新しいキー=>値を配列new $ newに追加したいと思っています。k => vは2つの間でnewを追加、削除、または変更しました。2つの配列間に新しい/削除/変更されたキー=>値のペアを設定します

これらは配列です:

$old = array(
    array('id'=> 111,'color'=> 'blue'), 
    array('id'=> 112,'color'=> 'red'), 
    array('id'=> 113,'color'=> 'black'), 
    array('id'=> 114,'color'=> 'smoke') 
); 

$new = array(
     array('id'=> 111,'color'=> 'green'), 
     array('id'=> 112,'color'=> 'red'), 
     array('id'=> 113,'color'=> ''), 
     array('color'=> 'new color') 
    ); 

私は古い新しい2配列を、チェックして、新しい配列$ end_resultを返したいです。

私が書く
$end_result = array(
     array('id'=> 111,'color'=> 'green','action'=>'changed'), 
     array('id'=> 112,'color'=> 'red','action'=>''), 
     array('id'=> 113,'color'=> '','action'=>'remove'), 
     array('color'=> 'new color','action'=>'new'), 
     array('id'=> 114,'color'=> 'smoke','action'=>'remove') 
    ); 

$newarray = array(); 
foreach ($new as $key_new => $value_new) { 
    $newarray[$key_new] = $value_new; 
    if(!isset($value_new['id'])){ 
     $newarray[$key_new]['action'] = 'new'; 
    }else {   
     foreach ($old as $key_old => $value_old) {    
      if($value_new['id'] == $value_old['id']){ 
       if(empty($value_new['color'])){      
        $newarray[$key_new]['action'] = 'remove'; 
       }else { 
        if($value_new['color'] != $value_old['color']){ 
         $newarray[$key_new]['action'] = 'changed'; 
        } 
       } 

      } 

     } 
    } 

} 
echo json_encode($newarray); 

//result: [{"id":111,"color":"green","action":"changed"},{"id":112,"color":"red"},{"id":113,"color":"","action":"remove"},{"color":"new color","action":"new"}] 

しかし!古い配列のキーID 114を確認し、$ newarrayでアクション "remove"を設定する方法

ありがとう!

+0

紹介文を改めてください。私はあなたの望む結果を理解するのが非常に困難です。たぶん、 '$ end_result = array();'のような配列として目的の結果を投稿する方が簡単かもしれません – MonkeyZeus

+0

私は$ end_resultを更新しました。コメントありがとう。 – user1828959

答えて

0

ここに私のコードがありますので、試してみてください。

$old = array(
    array('id'=> 111,'color'=> 'blue'), 
    array('id'=> 112,'color'=> 'red'), 
    array('id'=> 113,'color'=> 'black'), 
    array('id'=> 114,'color'=> 'smoke') 
); 

$new = array(
    array('id'=> 111,'color'=> 'green'), 
    array('id'=> 112,'color'=> 'red'), 
    array('id'=> 113,'color'=> ''), 
    array('color'=> 'new color') 
); 

// Set the output array to the new array, which is the gradually compared to the old one 
$array = $new; 
foreach ($old as $old_key => $oldarray) 
{ 
    // Flag is to check if the old id had any match in the new, else it is removed 
    $flag = true; 
    foreach ($new as $new_key => $newarray) 
    { 
     if (empty($newarray['id'])) 
     { 
      $array[$new_key]['action'] = 'new'; 
     } 
     else if ($newarray['id'] == $oldarray['id']) 
     { 
      $flag = false; 
      if (empty($newarray['color'])) 
      { 
       $array[$new_key]['action'] = 'remove'; 
      } 
      else if ($newarray['color'] != $oldarray['color']) 
      { 
       $array[$new_key]['action'] = 'change'; 
      } 
     } 
    } 
    if ($flag) 
    { 
     // Make sure we don't override any index already existing 
     $key = 0; 
     while (array_key_exists($key, $array)) 
     { 
      $key++; 
     } 
     $array[$key] = $oldarray; 
     $array[$key]['action'] = 'remove'; 
    } 
} 

echo json_encode($array); 

// Result: [{"id":111,"color":"green","action":"change"},{"id":112,"color":"red"},{"id":113,"color":"","action":"remove"},{"color":"new color","action":"new"},{"id":114,"color":"smoke","action":"remove"}] 
+0

あなたの解決に感謝します。 – user1828959

関連する問題