1

2つの異なる連想配列を比較して変更を返す関数はありますか?

例えば

$age = array("Peter"=>"35","Ben"=>"37","Joe"=>"");
$age2 = array("Peter"=>"38","Ben"=>"37","Joe"=>"43");

戻る

$return = array(
    "Peter"=>"Changed from 35 to 38",
    "Joe"=>"Changed from blank to 43"
);
4

4 に答える 4

5

array_diffは正しい道を歩み始めるかもしれません。探している正確な出力は得られませんが、2つのアレイの違いがわかります。

マークが指摘したように、array_diff_assocは、配列インデックスを維持するため、さらに役立つ場合があります。

于 2013-03-18T15:28:43.953 に答える
2

前に指摘したように、array_diff_assocあなたの出発点です。残りは、それぞれの違いに対して文字列を構築しています。

function compareAge($age, $age2)
{
    $return = array();
    foreach(array_keys(array_diff_assoc($age, $age2)) as $diffKey) {
        $from = empty($age[$diffKey]) ? 'blank' : $age[$diffKey];
        $to = empty($age2[$diffKey]) ? 'blank' : $age2[$diffKey];
        $return[$diffKey] = "Changed from {$from} to {$to}";
    }
    return $return;
}

動作デモ

于 2013-03-18T15:45:35.127 に答える
1

デフォルトは何もありません。私には時間がありました:) http://codepad.org/2UtrPE3o

<?
$age = array("Peter"=>"35","Ben"=>"37","Joe"=>"");
$age2 = array("Peter"=>"38","Ben"=>"37","Joe"=>"43");

$result = array();
foreach($age as $key=>$val) {
  if (array_key_exists($key, $age2)) {
    if ($val!==$age2[$key])
      $result[$key] = 'Changed from '.(empty($val)?'blank':$val).' to '. (empty($age2[$key])?'blank':$age2[$key]);
  } else {
    $result[$key] = 'Changed from '.(empty($val)?'blank':$val).' to blank';
  }
}

foreach($age2 as $key=>$val) {
  if (!array_key_exists($key, $age)) {
    $result[$key] = 'Changed from blank to ' . $val;
  }
}

var_dump($result);
?>
于 2013-03-18T15:37:43.020 に答える
0

これを確認してください、より効率的な解決策:

$age1   = array("Peter"=>"35","Ben"=>"37","Joe"=>"");
$age2   = array("Peter"=>"38","Ben"=>"37","Joe"=>"43");

$result = array_diff_assoc($age1, $age2);

$res    = array();
foreach($result as $key=>$val){
  $res[$key]  = "Changed from ".($val?$val:"Balnk")." to ".($age2[$key]?$age2[$key]:"blank");
}

echo "<pre>";
print_r($res);
于 2013-03-19T09:01:19.357 に答える