3

配列を比較するために私が読んだすべてのPHP関数(、、array_diff()などarray_intersect())は、配列要素の存在を比較しているようです。

同じ構造を持つ 2 つの多次元配列が与えられた場合、値の違いをどのようにリストしますか?

配列 1

[User1] => 配列 ([public] => 1
                [プライベート] => 1
                [シークレット] => 1
               )
[User2] => 配列 ([public] => 1
                [プライベート] => 0
                [シークレット] => 0
               )

アレイ 2

[User1] => 配列 ([public] => 1
                [プライベート] => 0
                [シークレット] => 1
               )
[User2] => 配列 ([public] => 1
                [プライベート] => 0
                [シークレット] => 0
               )

違い

[User1] => 配列 ([public] => 1
                [private] => 0 //この値は異なります
                [シークレット] => 1
               )

したがって、私の結果は、「すべてのユーザーのうち、User1 が変更されました。違いは、プライベートが 1 ではなく 0 であることです。」

4

4 に答える 4

4

1 つの方法は、これと同様のことを行う関数を作成することです。

function compareArray ($array1, $array2)
{
  foreach ($array1 as $key => $value)
  {
    if ($array2[$key] != $value)
    {
      return false;
    }
  }

  return true;
}

その関数を簡単に拡張して、2 つの違いの配列を返すことができます。

編集 - 探しているものにより近い洗練されたバージョンを次に示します。

function compareArray ($array1, $array2)
{
  var $differences;

  foreach ($array1 as $key => $value)
  {
    if ($array2[$key] != $value)
    {
      $differences[$key][1] = $value;
      $differences[$key][2] = $array2[$key];
    }
  }

  if (sizeof($differences) > 0)
  {
    return $differences;
  }
  else
  { 
    return true;
  }
}
于 2009-02-02T21:46:31.613 に答える
1

これはあなたが探していることをしていると思います。

サンプルデータを使用し、外側の配列でループを実行してarray_diff_assocから、毎回ユーザーで使用します。(これは、違いがある場合に、array_diff_assoc渡された2番目の配列から値を返すことを前提としています。これはそう思われます)。

<?php
$user1 = array("public" => 1, "private" => 1, "secret" => 1);
$user2 = array("public" => 1, "private" =>1, "secret" => 1);
$array1 = array ("user 1"=>$user1, "user 2"=>$user2);

$user1 = array("public" => 1, "private" => 0, "secret" => 1);
$user2 = array("public" => 1, "private" => 1, "secret" => 1);
$array2 = array("user 1"=>$user1, "user 2"=>$user2);

$results = array();  
foreach ( $array1 as $user => $value )
{
    $diff = array_diff_assoc( $array1[$user], $array2[$user] );
    if ($diff) {
        array_push($results,array($user=>$diff));   
        }
}


print_r($results);


?>

それは戻ります:

Array
(
    [0] => Array
        (
            [user 1] => Array
                (
                    [private] => 1
                )
        )    
)
于 2009-02-03T17:55:51.530 に答える
0

価値観の違いを求めるならarray_diff_assoc. http://us2.php.net/manual/en/function.array-diff-assoc.php"> php マニュアルには、「他のどの配列にも存在しない array1のすべてのを含む配列を返す」と記載されています。 " そして、次の例を示します。

この例では、"a" => "green" のペアが両方の配列に存在するため、関数からの出力には含まれていません。これとは異なり、2 番目の引数で "red" のキーが 1 であるため、ペア 0 => "red" が出力に含まれます。

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

上記の例では、次のように出力されます。

Array
(
    [b] => brown
    [c] => blue
    [0] => red
)

これはあなたが探しているものですか?

于 2009-02-03T02:52:15.600 に答える