2014-01-19 73 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的