从具有两个匹配子值的关联数组中删除元素

4

使用下面的示例,如何删除所有满足以下条件的重复顶级数组元素:

  • 相同的TicketID_xxxxx和Ticket_Reply_xxxxx编号(其中xxxxx是数字)
  • 还有匹配的时间戳?

附加信息的编辑:

  • 我将始终需要删除具有TicketID_xxxxx子数组,同时保留具有Ticket_Reply_xxxxx的子数组。

起始数组:

Array
(
    [0] => Array
        (
            [0] => 2018-03-03 07:43:15
            [1] => TicketID_25500
        )

     [1] => Array
         (
            [0] => 2018-03-03 08:00:00 //matching timestamp
            [1] => TicketID_25500
        )

    [2] => Array
        (
            [0] => 2018-03-03 08:00:00 //matching timestamp
            [1] => Ticket_Reply_25500
        )
}

期望结果:

Array
(
    [0] => Array
        (
            [0] => 2018-03-03 07:43:15
            [1] => TicketID_25500
        )

    [1] => Array
        (
            [0] => 2018-03-03 08:00:00
            [1] => Ticket_Reply_25500
        )
}

1
你可以尝试使用 array_unique(); - Ayaz Ali Shah
不确定 array_unique() 是否适用于此数组,因为您的输出将与输入相同(对于上面的示例)。在数组[0]和数组[1]的时间戳上失败,因为时间戳是不同的。 - IsThisJavascript
在你的例子中:你如何知道你需要保留“起始数组”中的[1][2]之间的哪一个? - Clément Baconnier
@Mr.Developer,我尝试了https://dev59.com/ImYr5IYBdhLWcg3wOXsQ中的一些方法,但该主题侧重于所有子值匹配。您能否给出一个示例,说明我如何在这种情况下使用array_unique()? - lin web
@cbaconnier 我将始终需要删除 TicketID_xxxxx,同时保留 Ticket_Reply_xxxxx。 - lin web
3个回答

2

您可以使用SORT_REGULAR选项。有关array_unique()的更多文档在此处

    <?php

$result = array(
    0=>array(0=>'2018-03-03 07:43:15',1=>'TicketID_25500'),
    1=>array(0=>'2018-03-03 08:00:00',1=>'TicketID_25500'),
    2=>array(0=>'2018-03-03 08:00:00',1=>'Ticket_Reply_25500'),
);

$details = unique_multidim_array($result ,'1'); 
print_r($details);
function unique_multidim_array($array, $key) { 
    $temp_array = array(); 
    $i = 0; 
    $key_array = array(); 

    foreach($array as $val) { 
        if (!in_array($val[$key], $key_array)) { 
            $key_array[$i] = $val[$key]; 
            $temp_array[$i] = $val; 
        } 
        $i++; 
    } 
    return $temp_array; 
} 

输出结果为:
Array
(
    [0] => Array
        (
            [0] => 2018-03-03 07:43:15
            [1] => TicketID_25500
        )

    [2] => Array
        (
            [0] => 2018-03-03 08:00:00
            [1] => Ticket_Reply_25500
        )

)

编辑:

`unique_multidim_array($result ,'1');` 

此函数传递两个参数。一个是数组,另一个是唯一值的键。

检查数组键值是否已存在的解释

if(!in_array($val[$key], $key_array))

如果该值和键不在数组中,返回该数组;否则,将其弹出,如下所示:

    $temp_array[$i] = $val;
return $temp_array;

您可以更改键(Key)以方便您的操作,例如“数字键”或“字符串键”,如下所示:unique_multidim_array($result ,'a');unique_multidim_array($result ,'b');

你误读了他的数据。第三个数组元素2是Ticket_Reply_25500,而你却写成了TicketID_25500。正如我之前在另一条评论中所说的那样,array_unique无法处理这种数据。 - IsThisJavascript
不错,输出也很稳定。干得好。不过,如果你是 PHP 新手的话,可能需要更详细地说明你所做的事情,因为这可能会让人感到相当困惑。 - IsThisJavascript
@Nawin 非常感谢!您介意在您的代码中添加一些注释,并提供一个使用TicketID和Ticket_Reply调用函数unique_multidim_array($array, $key)的示例吗? - lin web
@Nawin 我将这个答案标记为已接受。我的数组实际上要复杂得多,但在初始测试期间,这个方法效果很好。 - lin web
我不太懂英语,但我尽力解释了一下。@linweb - Nawin
@Nawin,你添加的评论对我帮助很大。感谢你额外提供的信息。 - lin web

1
希望这可以帮到你。
<?php

$a = array( 
    array("2018-03-03 07:43:15","TicketID_25500"),
    array("2018-03-03 08:00:00","TicketID_25500"),
    array("2018-03-03 08:00:00","Ticket_Reply_25500"),
    array("2018-03-03 08:03:00","Ticket_Reply_25500"),
);

function array_multi_unique($multiArray){
    $all = array_column($multiArray,1); // pass 0 for timestamp
    $unique = array_values(array_unique($all));

    foreach($unique as $key){
        $i = 0;
        foreach($multiArray as $k => $v){
            if(in_array($key,$v)){
                if($i != 0){
                    unset($multiArray[$k]);
                }
                $i++;
            }
        }
    }

    $multiArray = array_values($multiArray);
    return $multiArray;
}

$unique = array_multi_unique($a);
print_r($unique);

0

我认为你需要:

  1. 定义一个实现Hashtable的类(假设为A),以便拥有自己的equals方法。该类的数据成员将是ticket id和时间戳。
  2. 实例化一个名为“uniqueEntries”的php set
  3. 实例化一个数组“duplicateIndexes”。
  4. 对于数组中的每个项
    • 遍历数组,创建一个类A的实例,并使用对象的ticket id和时间戳。
    • 检查Set是否包含此对象。
    • 如果不包含,则在Set中添加此新对象。
    • 如果包含相同的对象,则在duplicateIndexes数组中记录当前迭代计数。
  5. 现在从索引存在于duplicateIndexes中的数组中删除元素。

我更喜欢不使用类的方法,除非提供了完整的示例,因为我不熟练PHP:Classes。非常感谢,我会进一步研究这个问题。 - lin web

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接