2012-04-22 5 views
2

私はテーブルの「行」(つまり、あなたは$tab[$i]->columnname」を通じて、各列にアクセスすることができますオブジェクト$tabの配列を持っている。PHP: "類似の"オブジェクトの2つの配列間の違いを計算する方法は?

私は別のAJAX呼び出しの戻りであるオブジェクトの配列$tab_json、それを持っています、含まれていあまりに、テーブルの「行」(つまり、あなたは「両方配列がまったく同じcolumsを含ま

$tab_json[$i]->columnnameが、私はちょうどしたい 『を通じて、各列にアクセスすることができます$tabに』どれを推測ではないがに存在する。

もちろん、私はarray-intersectarray-diff関数を知っていますが、オブジェクト比較ではうまく機能していないようです。私が間違っていない限り?ここで

は、私が仕事したいサンプルですが、PHPの例外があります:

tab_json = PHP Catchable fatal error: Object of class stdClass could not be converted to string in sample.php on line 112 

はちょうどそれを貼り付け、ファイル(php -f filename.php)にそれを実行してコピーします。どのように私は何をすべきか?

<?php 
$tab = array(
    (object)array(
     'id'   => 1, 
     'titre'  => "Anchois", 
     'attributs' => array() 
    ), 
    (object)array(
     'id'   => 4, 
     'titre'  => "Jambon", 
     'attributs' => array() 
    ), 
    (object)array(
     'id'   => 12, 
     'titre'  => "La Cabro d'or", 
     'attributs' => array(
      (object)array("id" => 1), 
      (object)array("id" => 8) 
     ) 
    ) 
); 


$tab_json = array (
    (object)array(
     'id' => 1, 
     'titre' => 'Anchois', 
     'attributs' => 
     array (
     ), 
    ), 
    (object)array(
     'id' => 4, 
     'titre' => 'Jambon', 
     'attributs' => 
     array (
     ), 
    ), 
    (object)array(
     'id' => 12, 
     'titre' => 'La Cabro d\'or', 
     'attributs' => 
     array (
     ), 
    ), 
    (object)array(
     'id' => 25, 
     'titre' => 'Vin rouge ou rosé', 
     'attributs' => 
     array (
     ), 
    ), 
    (object)array(
     'id' => 22, 
     'titre' => 'Crème oignons lardons', 
     'attributs' => 
     array (
      (object)array(
       'id' => 1, 
      ), 
      (object)array(
       'id' => 2, 
      ), 
     ), 
    ) 
); 
echo "tab = "; var_export($tab); echo "\n"; 
echo "tab_json = "; var_export($tab_json); echo "\n"; 
echo "tab_json = "; var_export(array_diff($tab_json,$tab)); echo "\n"; 
?> 
+0

同一のオブジェクトまたは異なるオブジェクトを同一のデータと比較していますか? –

+0

同じプロパティだが**多分もっとオブジェクト**、**多分**プロパティの値が変更されている(これは私が実際に推測したいものだ) –

+0

私はちょうど私が働きたい具体的なサンプルを追加した。 –

答えて

0

私は "ok"と比較するような機能を作っています。両方の配列のプロパティを "連結"して "文字列"を作成し、strcmp()関数を使用して結果を返します。 値が異なると文字列に変更され、サブ配列の場合は文字列= "Array"に変換されるので、比較== 0となるので、 "サブ"配列は無視されますそれは私が望んでいたものです)。

これは機能します。私にそれがうまくいかないことを示すことができる例を見つけたら、コメントの中でそれを私と共有してください。ありがとう!

$difference = array_udiff($tab_json, $tab, function($a, $b) { 
    $d=array_diff_assoc(get_object_vars($a), get_object_vars($b)); 
    if (count($d)>0) { 
     $s0=''; 
     $s1=''; 
     foreach ($d as $k=>$val) { 
      $r0=(string)$val; 
      $r1=(string)$b->$k; 
      $l0 = mb_strlen($r0); 
      $l1 = mb_strlen($r1); 
      for (;$l0<$l1;$l0++) { 
       $r0=' '.$r0; 
      } 
      for (;$l1<$l0;$l1++) { 
       $r1=' '.$r1; 
      } 
      $s0.=$r0; 
      $s1.=$r1; 
     } 
     return strcmp($s0,$s1); 
    } 
    return 0; 
}); 
echo "difference = "; var_export($difference); echo "\n"; 
0

あなたはarray_udiffを使用することができます。

$difference = array_udiff($tab, $tab_json, function($a, $b) { 
    return $a == $b; 
}); 

それだけで同一の文字列値を比較しているため、単純なarray_diffを使用することはできません。このサンプルを実行するにはPHP 5.3が必要ですが、PHP 5.2でクロージャを外部関数に移動し、その名前を第3パラメータとしてarray_udiffに渡すことができます。

array_udiffの注文が重要であることに注意してください。最初に$tab_jsonを渡すと、異なる結果が得られます。

+0

あなたの答えをありがとうが、残念ながらそれはありません私はちょうど私の質問で追加したサンプルで動作:空の配列を返します。 –

+0

私はこのコードをクロージャのために試してみてください: 'return(count(array_diff(get_object_vars($ a)、get_object_vars($ b)))> 0;'それは動作しませんが、結果は空の配列ではありません私は今、貴重な解決策から近いかもしれません)。まだ探している。 –

+0

比較しているオブジェクトのサンプルがありますか? – alganet

関連する問題