【问题标题】:PHP delete specific row from a multidimensional array with ALMOST duplicate valuesPHP从具有几乎重复值的多维数组中删除特定行
【发布时间】:2015-05-10 16:47:27
【问题描述】:

我有一个多维数组,其中两行几乎是重复的,但不完全是重复的。例如:

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.可以手动设置日期。有时可能会为用户提供一个自动日期,但也可能是一个手动日期。

在这种情况下,我们在数组中有一个用户的双重输入,唯一的区别是天数。我如何得到这一切是相当复杂的,所以之后删除具有较高天数的行比避免一开始就更容易。

但我必须在不知道其中任何一个的情况下找到这些双值。我也不知道双精度值会出现在哪个索引处。如果两个“用户名”列具有相同的值,我将需要遍历数组,比较每一行。如果他们有,则必须查看该行的“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);
        }
    }

因此,当我合并 $manual 和 $user 时,可能会发生相同的用户在两个数组中,因为它们的 curr = 1 AND manual = 1。 例如,如果我只是在第一个 MySQL 语句中添加“AND manual = 0”,则会出现“数组大小不一致”问题,因此我只想删除天数较高的行。 名称是唯一的。

【问题讨论】:

  • 在遍历数组时,存储前一个数组索引中的值。现在将其与当前数组索引的当前值进行比较。如果旧数组索引的两个或三个值与 current 匹配,则将其删除。得到?

标签: php arrays multidimensional-array


【解决方案1】:

假设您的数组结构相当一致,您可以遍历数组,比较相似的值并记录迄今为止具有最高比较值的索引。这个问题有点宽泛,因为你没有提供很多关于你的代码的信息。如果您想要一个更简洁的答案,您将需要更好地解释您的问题,提供更多代码示例以及您尝试过的事情。

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');

【讨论】:

  • 我在我的问题中添加了一些文字来解释。不过,您的示例对我来说是一个很好的起点。
  • 能否提供更大的数据样本和更多的代码?用户名是唯一的吗?
  • 将其添加到问题中。是的,用户名是唯一的,这不会有问题。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 2018-05-20
  • 1970-01-01
  • 2017-05-19
  • 2018-12-26
  • 2017-07-23
  • 2019-11-09
  • 2017-06-01
相关资源
最近更新 更多