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

时间:2018-03-05 10:18:11

标签: php duplicates associative-array

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

  • 相同的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
        )
}

3 个答案:

答案 0 :(得分:2)

您可以使用SORT_REGULAR选项更多文档HERE关于array_uniqy()

    <?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; 
} 

O / P是:

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

答案 1 :(得分: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);

答案 2 :(得分:0)

我认为你需要

  1. 定义一个实现Hashtable的类(假设A),以便拥有自己的equals方法。此类的数据成员将是故障单ID和时间戳。
  2. 实例化php set'uniqueEntries'。
  3. 实例化数组'duplicateIndexes'。
  4. 对于数组中的每个项目
    • 遍历数组以创建具有票证ID的A类实例 和对象的时间戳。
    • 检查Set是否包含此对象。
    • 如果没有,请在“设置”中添加此新对象。
    • 如果它包含相同的对象,请记下duplicateIndexes数组中的当前迭代计数。
  5. 现在从其索引存在于duplicateIndexes中的数组中删除元素。