2015-05-10 130 views
-3

我有一個多維數組,其中可能發生兩行幾乎是重複的但不完全。例如:PHP從具有ALMOST重複值的多維數組中刪除特定行

Array (... 
[2] => Array ([username] => Akando [grpNo] => 5 [away] => 0 [manudate] => 1428357600 [seit] => 12) 
... 
[7] => Array ([username] => Akando [grpNo] => 5 [away] => 0 [manudate] => 1428357600 [seit] => 33)) 

它們只有['seit']值不同。當這樣的事情發生時,我想從數組中移除具有最高['seit']值的行。我怎樣才能做到這一點?

編輯:好的,多一點信息。對不起,我只是覺得這就夠了。此數組包含有關其他用戶正在等待的用戶的信息。他們等待的時間是幾天。自他們等待特定用戶以來的日期可以通過兩種方式給出:1.當某些條件適用時,它將自動設置。 2.日期可以手動設置。有時會發生用戶被賦予自動日期,但也可能發生手動日期。

在這種情況下,我們有一個用戶在數組中的雙重輸入,唯一的區別是日子。我如何解決這一問題非常複雜,因此,將之後的較高日期數刪除會比在開始時避免使用它們更容易。

但是我必須在不知道它們的情況下找到這些雙重值。我也不知道在哪個索引處會出現double值。我需要遍歷數組,比較每行,如果兩個「用戶名」列具有相同的值。如果他們有,它必須看着行的'seit'列來找出哪個行具有更高的'seit'值。然後刪除這一行。

我只是不能包住我的頭如何編碼。

EDIT2:一些更多的代碼:

// Get the users we are waiting for automatically 
    $result = $db->query("SELECT username, grpNo, away, manudate FROM bb".$n."_counter WHERE curr = '1'"); 
    while($row=$db->fetch_array($result)) 
    {  
     $user[] = $row; 
    } 

    // Sort $user DESC 
    foreach ($user as $key => $node) 
    { 
     $gruppe[$key] = $node['grpNo']; 
    } 
    array_multisort($gruppe, SORT_DESC, $user); 
    $user = array_map("unserialize", array_unique(array_map("serialize", $user))); 

    // Turn date into days since today 
    for($i = 0; $i < count($user); $i++) 
    { 
     $user[$i]['seit'] = floor((time() - $max[$i]['seit'])/(60 * 60 * 24)); 
    } 
    // --------------------------------- 

    // Set dates manually 
    $result = $db->query("SELECT username, grpNo, away, manudate FROM bb".$n."_counter WHERE manual = '1'"); 
    while($row=$db->fetch_array($result)) 
    {  
     $manual[] = $row; 
    } 

    if(!empty($manual)) 
    { 
     for($i = 0; $i < count($manual); $i++) 
     { 
      $manual[$i]['seit'] = floor((time() - $manual[$i]['manudate'])/(60 * 60 * 24)); 
     } 
     // merge $manual and $user 
     if(isset($manual)) 
     { 
      $user = array_merge_recursive($user, $manual); 
     } 
    } 

所以,當我合併$手動和$用戶可能會發生相同的用戶是在兩個數組,因爲他們有CURR = 1和手動= 1。 例如,如果我只是在第一個MySQL語句中添加「AND manual = 0」,我會得到一個「數組大小不一致」的問題,因此我只想去掉行數較高的行。 名稱是唯一的。

+0

在循環數組時,存儲以前數組索引的值。現在將它與當前數組索引的當前值進行比較。如果舊數組索引的兩個或三個值與當前匹配,請將其刪除。獲取? –

回答

0

假設您的數組結構相當一致,您可以遍歷數組,比較類似的值並記錄迄今爲止具有最高比較值的索引。這個問題有點寬泛,因爲你沒有提供很多關於你的代碼的信息。如果您想要更簡潔的答案,您需要更好地解釋您的問題,提供更多代碼示例以及您嘗試過的內容。

http://repl.it/nUQ - 一個非常粗略的例子。我會讓你把它推斷成你可以在你的環境中應用的東西。

$multi = Array(
    Array(
     'name' => 'bob', 
     'age' => '42', 
     'id' => 412), 
    Array(
     'name' => 'bob', 
     'age' => 42, 
     'id' => 624), 
    Array(
     'name' => 'jim', 
     'age' => 35, 
     'id' => 800) 
); 


function remove_highest($arr, $iden, $comp) { 
    $highest = 0; 
    $row = -1; 

    foreach ($arr as $key=>$value) { 
     if (isset($value[$iden[0]]) && 
      $value[$iden[0]] === $iden[1]) { 
      if ($value[$comp] > $highest) { 
       $highest = $value[$comp]; 
       $row = $key; 
      } 
     } 
    } 

    if ($row > -1) { 
     array_splice($arr, $row, 1); 
    } 

    return $arr; 
} 

$current = remove_highest($multi, ['name', 'bob'], 'id'); 
+0

我在我的問題中添加了一些文字來解釋。不過,你的例子對我來說是一個很好的起點。 – Khalliys

+0

你能否給我們提供一個更大的數據樣本和更多的代碼?用戶名是否唯一? – Oka

+0

將其添加到問題中。是的,用戶名是唯一的,這不會有問題。 – Khalliys