PHP subset of 2 arrays containing objects - compared only by 1 attribute
As far as these things go, I think your performance is going to be close to ideal.  There is maybe a little room for improvement, namely:

I'm pretty sure all you need is array_udiff.  My suspicion (and some quick tests) suggest that this:

$subset = array_diff( $array_2, array_intersect( $array_1, $array_2 ) );


Is exactly equivalent to this:

$subset = array_diff( $array_2, $array_1 );


(some details excluded for brevity) So save yourself an expensive function call.  My only other suggestion would be a more "global" change that may or may not be helpful.  In your example it looks like you don't care about the keys.  In that case, use them.  When you build your array of objects use order_hash( $obj ) as the key.  They you can do array_diff on the array_keys, without having to worry about compare_objects method, i.e.:

$array1 = [
    order_hash( $o1 ) =&gt; $o1,
    order_hash( $o2 ) =&gt; $o2,
];

$array2 = [
    ... same thing ...
]

$keys_to_check = array_diff( array_keys( $array2, $array1 ) );
foreach ( $keys_to_check as $key )
    do_something( $array2[$key] );


It is a different way of organizing your data structures, and it takes a little more awareness about how your objects are stored.  However, if these arrays of objects are being passed back and forth frequently, and if you are frequently doing these kinds of comparisons, it can save you a lot of time (I think) because you only have to do your hash calculation once per object, instead of doing it once per object per intersect.

I frequently organize my structures this way (and do lots of diffs on them), and I find it easier to follow.  Basically, the thinking changes from:

Use this function to compare these arrays and see which ones are different

to

Check the keys of this array to see which ones are different

Personally I prefer the latter.