2

$tabテーブルの「行」であるオブジェクトの配列があります(つまり、「 $tab[$i]->columnname.

$tab_jsonAJAX呼び出しの戻り値であり、テーブルの「行」含むオブジェクトの別の配列があります(つまり、「 $tab_json[$i]->columnname.

両方の配列にはまったく同じ列が含まれていますが、どの列が に存在しないかを「推測」したい$tabと思います$tab_json

もちろん、 array-intersect関数とarray-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";
?>
4

2 に答える 2

0

使用できますarray_udiff

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

simplearray_diffは、文字列値をまったく同じに比較するだけなので、使用できません。このサンプルを実行するには PHP 5.3 が必要ですが、クロージャーを外部関数に移動し、その名前を の 3 番目のパラメーターとして渡すことで、PHP 5.2 に微調整できますarray_udiff

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

于 2012-04-22T16:54:11.287 に答える
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";
于 2012-04-22T21:29:57.093 に答える