2

我有一个对象数组,$tab它们是表的“行”(即您可以通过 " 访问每一列$tab[$i]->columnname

我有另一个对象数组,$tab_json它是 AJAX 调用的返回,它也包含的“行”(即您可以通过“访问每一列” $tab_json[$i]->columnname

两个数组都包含完全相同的列,但我只想“猜测”其中的$tab哪些存在于$tab_json.

当然,我知道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";
?>
4

2 回答 2

0

您可以使用array_udiff

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

array_diff不能使用simple ,因为它只比较相同的字符串值。运行此示例需要 PHP 5.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 回答