Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个PHP对象—PHP和对象_Php_Arrays_Object - Fatal编程技术网

比较两个PHP对象—PHP和对象

比较两个PHP对象—PHP和对象,php,arrays,object,Php,Arrays,Object,我有两个这样的物体 $array1 stdClass Object ( [BellId] => 2 [BellCode] => BP001 [BellDescription] => SPI SPEED ABNORMAL,CHK BELT [ControllerId] => 3 [CreatedBy] => 1 [CreatedOn] => 2016-08-19 15:09:25 [ModifiedBy] =>

我有两个这样的物体

$array1

stdClass Object ( 
  [BellId] => 2 
  [BellCode] => BP001 
  [BellDescription] => SPI SPEED ABNORMAL,CHK BELT 
  [ControllerId] => 3 
  [CreatedBy] => 1 
  [CreatedOn] => 2016-08-19 15:09:25 
  [ModifiedBy] => 
  [ModifiedOn] => 
)
$array2

stdClass Object ( 
  [BellId] => 1 
  [BellCode] => BP002 
  [BellDescription] => MCB TRIPPED,CHK MTR SHORT,O/L. 
  [ControllerId] => 3 
  [CreatedBy] => 1 
  [CreatedOn] => 2016-08-19 15:09:25 
  [ModifiedBy] => 
  [ModifiedOn] => 
) 
我需要比较这个物体,得到这两个物体的区别

我已经检查了以下链接,但没有使用

我的示例代码如下

function recursive_array_diff($a1, $a2) { 
    $r = array(); 
    foreach ($a1 as $k => $v) {
        if (array_key_exists($k, $a2)) { 
            if (is_array($v)) { 
                $rad = recursive_array_diff($v, $a2[$k]); 
                if (count($rad)) { 
                    $r[$k] = $rad; 
                } 
            } else { 
                if ($v != $a2[$k]) { 
                    $r[$k] = $v; 
                }
            }
        } else { 
            $r[$k] = $v; 
        } 
    } 
    return $r; 
}

有人能帮我写代码吗。

首先将两个对象转换为数组:

$arrayA = (array)$objectA;
$arrayB = (array)$objectB;
$d = array_udiff_assoc((array)$array1, (array)$array2, function ($x, $y) {
  if (! (is_scalar($x) && is_scalar($y))) {
    trigger_error("skipping non-scalar members!", E_USER_WARNING);
    // you might want to handle this in the app-specific way
  }

  if (is_numeric($x) && is_numeric($y))
    return $x - $y;

  return strcmp($x, $y);
});
var_dump($d);
然后使用array_diff获得数组之间的差异

$difference = array_diff($arrayA, $arrayB);
这将返回一个数组,其中包含来自第一个数组$arrayA的键及其值,该数组指示两个对象之间的不同字段

foreach($difference as $key => $diff) {
    echo $objectA->$key;
    echo $objectB->$key;

    // the above two values will be different
}

注意:如果您知道两个对象中的字段顺序相同,则可以使用array_diff,但是最好在此处使用array_diff_assoc,因为这提供了额外的索引检查。

首先将两个对象转换为数组:

$arrayA = (array)$objectA;
$arrayB = (array)$objectB;
$d = array_udiff_assoc((array)$array1, (array)$array2, function ($x, $y) {
  if (! (is_scalar($x) && is_scalar($y))) {
    trigger_error("skipping non-scalar members!", E_USER_WARNING);
    // you might want to handle this in the app-specific way
  }

  if (is_numeric($x) && is_numeric($y))
    return $x - $y;

  return strcmp($x, $y);
});
var_dump($d);
然后使用array_diff获得数组之间的差异

$difference = array_diff($arrayA, $arrayB);
这将返回一个数组,其中包含来自第一个数组$arrayA的键及其值,该数组指示两个对象之间的不同字段

foreach($difference as $key => $diff) {
    echo $objectA->$key;
    echo $objectB->$key;

    // the above two values will be different
}
注意:如果您知道两个对象中的字段顺序相同,则可以使用array_diff,但是最好在此处使用array_diff_assoc,因为这提供了额外的索引检查。

使用;e、 g:

注意:您可以将stdClass实例透明地强制转换为数组,反之亦然:

$arr = ['id' => 1];
$obj = (object) $arr;
$arr = (array) $obj;

// etc. 
希望这有帮助:

使用;e、 g:

注意:您可以将stdClass实例透明地强制转换为数组,反之亦然:

$arr = ['id' => 1];
$obj = (object) $arr;
$arr = (array) $obj;

// etc. 
希望这对您有所帮助:

使用array\u udiff\u assoc,您可以使用回调随时比较项目。当然,您需要将对象强制转换为数组:

$arrayA = (array)$objectA;
$arrayB = (array)$objectB;
$d = array_udiff_assoc((array)$array1, (array)$array2, function ($x, $y) {
  if (! (is_scalar($x) && is_scalar($y))) {
    trigger_error("skipping non-scalar members!", E_USER_WARNING);
    // you might want to handle this in the app-specific way
  }

  if (is_numeric($x) && is_numeric($y))
    return $x - $y;

  return strcmp($x, $y);
});
var_dump($d);
其中,$x和$y是正在比较的数组中的项

样本输出

这是一种非常灵活的方式。您可以将自己的比较逻辑放入回调中。例如,您可能希望比较类的实例:

  static $date_fmt = 'YmdHis';

  if ($x instanceof DateTime)
    $x = $x->format($date_fmt);
  if ($y instanceof DateTime)
    $y = $y->format($date_fmt);
使用array_udiff_assoc,您可以使用回调对项目进行比较。当然,您需要将对象强制转换为数组:

$arrayA = (array)$objectA;
$arrayB = (array)$objectB;
$d = array_udiff_assoc((array)$array1, (array)$array2, function ($x, $y) {
  if (! (is_scalar($x) && is_scalar($y))) {
    trigger_error("skipping non-scalar members!", E_USER_WARNING);
    // you might want to handle this in the app-specific way
  }

  if (is_numeric($x) && is_numeric($y))
    return $x - $y;

  return strcmp($x, $y);
});
var_dump($d);
其中,$x和$y是正在比较的数组中的项

样本输出

这是一种非常灵活的方式。您可以将自己的比较逻辑放入回调中。例如,您可能希望比较类的实例:

  static $date_fmt = 'YmdHis';

  if ($x instanceof DateTime)
    $x = $x->format($date_fmt);
  if ($y instanceof DateTime)
    $y = $y->format($date_fmt);

您可以检查这个答案,它似乎使用了与您相同的函数。我已经发布了一个答案,但我想问您为什么要在代码中执行递归差异?您指定的对象示例只有一个层次。您可以检查这个答案,它似乎使用了与您相同的函数。我已经发布了一个答案,但我想问您为什么要在代码中执行递归差异?您指定的对象示例只有一个级别的深度;在一行中获取一个diff对象。甚至可能$difference=objectarray\u diffarray$objectA,array$objectB;在一行中获取一个diff对象。