2015-05-10 65 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