我有一个对象数组$tab
,它们是表格的“行”(即您可以通过“$tab[$i]->columnname
”访问每一列。
我有另一个对象数组$tab_json
,它是AJAX调用的返回,它包含 too ,表的“行”(即你可以访问每一列) “$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";
?>
答案 0 :(得分:0)
您可以使用array_udiff
:
$difference = array_udiff($tab, $tab_json, function($a, $b) {
return $a == $b;
});
不能使用简单array_diff
,因为它只相同地比较字符串值。运行此示例需要PHP 5.3,但您可以将其调整为PHP 5.2将闭包移动到外部函数并将其名称作为array_udiff
上的第三个参数传递。
请注意array_udiff
上的订单很重要。如果您先通过$tab_json
,则会得到不同的结果。
答案 1 :(得分:0)
我已经创建了似乎比较“ok”的函数:我“连接”两个数组的属性以生成“字符串”,然后使用strcmp()函数返回结果。
因此,当值不同时,它们会变为字符串,当涉及“子”数组时,它们会转换为string =“Array
”,因此比较== 0所以“sub”数组被忽略(这正是我想要的)。
有效。如果你找到一个可以告诉我它不起作用的例子,请在评论中与我分享。谢谢!
$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";