2014-01-19 53 views
3

我必须包含如下所示,第一个数组对象数组:PHP多阵列差异

Array 
(
[1] => stdClass Object 
    (
     [matchID] => 1 
     [tm] => 2014-01-16 08:55:13 
     [playertm] => 2014-01-16 08:55:14 
    ) 

[2] => stdClass Object 
    (
     [matchID] => 2 
     [tm] => 2014-01-16 09:53:50 
     [playertm] => 2014-01-16 09:53:52 
    ) 

[3] => stdClass Object 
    (
     [matchID] => 3 
     [tm] => 2014-01-16 09:58:49 
     [playertm] => 2014-01-16 09:58:57 
    ) 

[4] => stdClass Object 
    (
     [matchID] => 4 
     [tm] => 2014-01-17 08:44:34 
     [playertm] => 2014-01-17 08:44:35 
    ) 
) 

二阵:

Array 
(
[3] => stdClass Object 
    (
     [matchID] => 3 
     [tm] => 2014-01-16 09:58:49 
     [playertm] => 2014-01-16 09:58:57 
    ) 

[4] => stdClass Object 
    (
     [matchID] => 4 
     [tm] => 2014-01-17 08:44:34 
     [playertm] => 2014-01-17 08:44:38 
    ) 

[5] => stdClass Object 
    (
     [matchID] => 5 
     [tm] => 2014-01-19 08:44:34 
     [playertm] => 2014-01-19 08:44:38 
    ) 
) 

,我试图根据时代每个阵列同步。我想返回4个结果:

  1. 第一阵列中有一个比第二阵列更近
  2. 第二阵列中有一个时间的对象更近的比第一阵列
  3. 的对象
  4. 第一阵列在具有“playertm”比第二阵列更近的对象
  5. 第二阵列在具有“playertm”比所述第一阵列

一些结果毫安更近的对象y不在每个数组中,并且需要返回,但数组键总是匹配。

我使用的“array_udiff”功能和迄今有以下几点:

function tmCompare($a, $b) 
{ 
    return strtotime($a->tm) - strtotime($b->tm); 
} 
function ptmCompare($a, $b) 
{ 
    return strtotime($a->playertm) - strtotime($b->playertm); 
} 

$df1 = array_udiff($a, $b, 'tmCompare'); 
$df2 = array_udiff($b, $a, 'tmCompare'); 

$df3 = array_udiff($a, $b, 'ptmCompare'); 
$df4 = array_udiff($b, $a, 'ptmCompare'); 

出现返回的差异,但是阵列[4]中的每个的最后2个函数被返回,而余只有当时间较大而不仅仅是不同时,才希望它被返回。

我已经试过

return (strtotime($a->playertm) > strtotime($b->playertm)) ? -1 : 0; 

和类似的,但似乎无法得到正确的结果。我在这里错过了一些简单的东西,还是想着这个错误?

编辑:这里是一个快速引擎收录获得运行http://pastebin.com/gRz9v2kz

感谢任何帮助的代码。

+0

我们可以假设数组是通过时间在你的榜样排序?例如。第二个数组中最近的时间将是最后一个元素的时间。 – kba

+0

因此,为了帮助他人,每个阵列的预期结果是什么? –

+0

[tm]可以总是按旧到旧排序,但[playertm]可能不是。预期的结果应该是 1 [1] [2] 2. [5] 3. [1] [2] 4 [4] [5] 如果数组是在1.它不该与3.和4一样。 希望我已经解释得很好。相同的结果将被忽略,并且每个结果只返回最近的结果。 – Thomas

回答

1

我不知道为什么会发生这种情况,但使用array_udiff()似乎违反直觉。我已经重写两种功能的要求进行比较,并遍历数组:

function getCompareFunction($field) 
{ 
     return function($a, $b) use ($field) { 
       return strcmp($a->{$field}, $b->{$field}); 
     }; 
} 

function getBigger($a, $b, $compare) 
{ 
     $res = array(); 

     foreach ($a as $k => $v) { 
       if (!isset($b[$k]) || $compare($v, $b[$k]) > 0) { 
         $res[$k] = $v; 
       } 
     } 

     return $res; 
} 

$biggerTime = getCompareFunction('tm'); 
$biggerPlayerTime = getCompareFunction('playertm'); 

print_r(getBigger($a, $b, $biggerTime)); // [1, 2] 
print_r(getBigger($b, $a, $biggerTime)); // [4, 5] 
print_r(getBigger($a, $b, $biggerPlayerTime)); // [1, 2] 
print_r(getBigger($b, $a, $biggerPlayerTime)); // [4, 5] 
+0

谢谢你这个美丽的解决方案。这是一种全新的观察方式,完全按照计划进行。我最初开始看这个与if语句/ foreach的很多类似,但是不知道strcmp。 – Thomas

0

我希望,这将是容易,如果你可以重新构建以下结构的阵列,因此可以使4组合出两个对象。你可以对它们进行排序为u想

[1] => stdClass Object 
    (
     [matchID] => 1 

     [tm] =>08:55:13 
     [td] =>2014-01-16 
     [playertm_date] => 2014-01-16 
     [playertm_time] => 08:55:14 

    ) 

多了一个替代的解决方案是Json的