2017-05-18 6 views
1

次のコードは、最初の配列(parameter1)を2番目の配列(parameter2)と比較し、どの要素が変更されたかを示す配列を返します。配列の差が編集された値を返す

$array_data = array(
    "studDetails" => array(
     "studDet" => array(
      "studClass" => "V", 
     ), 
    ), 
    "email"  => "[email protected]", 
    "systemNames" => array("EMR"), 
); 
$array_edited = $array_data; 

//EDITING 
$array_edited['email'] = "kam"; 
$array_edited['studDetails']['studDet']['studClass'] = "VV"; 

echo "<pre>"; 
print_r(array_diff_assoc2_deep($array_edited, $array_data)); 


function array_diff_assoc2_deep($array_edited, $array_data) 
{ 
    $difference = array(); 
    foreach ($array_edited as $row => $value) { 
     if (!isset($array_data[$row]) && !empty($value)) { 
      $difference['added'][$row] = $value; 
     } else if (is_array($array_edited[$row]) && is_array($array_data[$row])) { 
      $difference[$row] = array_diff_assoc2_deep($array_edited[$row], $array_data[$row]); 
     } else if ((string)$value != (string)$array_data[$row]) { 
      $difference['edited'][$row] = array("old" => $array_data[$row], "new" => $value); 
     } 

    } 
    $difference = array_filter($difference); 
    return $difference; 
} 

OUTPUT:

Array (
    [studDetails] => Array (
     [studDet] => Array (
      [edited] => Array (
       [studClass] => Array (
        [old] => V 
        [new] => VV 
       ) 
      ) 
     ) 
    ) 
    [edited] => Array (
     [email] => Array (
      [old] => [email protected] 
      [new] => kam 
     ) 
    ) 
) 

私は、出力は関係なく、内部の配列があるどのように多くの単一編集したキーにならないようにしたいです。

所望の出力:

Array (
    [edited] => Array (
     [email] => Array (
      [old] => [email protected] 
      [new] => kam 
     ) 
     [studClass] => Array (
      [old] => V 
      [new] => VV 
     ) 
    ) 
) 

答えて

0

これが起こる理由は、再帰呼び出しである:この行では

$difference[$row] = array_diff_assoc2_deep($array_edited[$row], $array_data[$row]); 

、あなたは別のキーに各再帰比較結果を置きます。

あなたはあなたが欲しいものを得るでしょう、これを行うが、フラットな結果の配列を保持していない場合:

function array_diff_assoc2_deep($array_edited, $array_data, $difference = array()) 
{ 
    foreach ($array_edited as $row => $value) { 
     if (!isset($array_data[$row]) && !empty($value)) { 
      $difference['added'][$row] = $value; 
     } else if (is_array($array_edited[$row]) && is_array($array_data[$row])) { 
      $difference = array_diff_assoc2_deep($array_edited[$row], $array_data[$row], $difference); 
     } else if ((string)$value != (string)$array_data[$row]) { 
      $difference['edited'][$row] = array("old" => $array_data[$row], "new" => $value); 
     } 

    } 
    $difference = array_filter($difference); 
    return $difference; 
} 

3行が変更されました:

function array_diff_assoc2_deep($array_edited, $array_data, $difference = array()) 
//{ 
## REMOVED: $difference = array(); 
// foreach ($array_edited as $row => $value) { 
//  if (!isset($array_data[$row]) && !empty($value)) { 
//   $difference['added'][$row] = $value; 
//  } else if (is_array($array_edited[$row]) && is_array($array_data[$row])) { 
      $difference = array_diff_assoc2_deep($array_edited[$row], $array_data[$row], $difference); 
//  } else if ((string)$value != (string)$array_data[$row]) { 
//   $difference['edited'][$row] = array("old" => $array_data[$row], "new" => $value); 
//  } 
// 
// } 
// $difference = array_filter($difference); 
// return $difference; 
//} 

をあなたは出力を見ることができますhere

関連する問題