PHP删除重复的多维数组

时间:2016-07-15 15:28:45

标签: php arrays multidimensional-array foreach duplicates

这是我将用于过滤的输入数组。

[TESTING] => Array
    (
        [0] => Array
            (
                [a] => false
                [b] => WCP
                [c] => Title A
            )

        [1] => Array
            (
                [a] => false
                [b] => WCP
                [c] => Title B
            )

        [2] => Array
            (
                [a] => false
                [b] => WCP
                [c] => Title C
            )

    )

我想删除具有以下两者的重复记录:keys [a]和[b]具有相同的值。我不想使用[c]作为删除重复记录的条件。这种情况下的输出应为。

[TESTING] => Array
    (
    )

因为所有3个子数组都具有键[a]的值,而键[b]具有相同的值。我使用array_unique()但是这个函数使用所有3 [a],[b]和[c]作为条件来删除我不想要的重复记录。我没有得到我想要的输出。

需要帮助。有什么建议或想法吗?

3 个答案:

答案 0 :(得分:0)

PHP中的数组函数主要用于2D数组。您将需要迭代多维数组,进行键值的比较,然后将正确的结果分配给保持数组。保持数组需要一个范围,允许多维迭代通过多维数组的上层。这可以作为array_filter使用的函数来完成;或者,通过独立的重新分配完成。

答案 1 :(得分:0)

试试这个,

function clearDuplicates($array)
{
   $new_array=array();

    for($i=0;$i<count($array);$i++)
    {
        $x=false;
        for($j=0;$j<count($array);$j++)
        if($j!=$i)
            if($array[$i]["a"]==$array[$j]["a"] && $array[$i]["b"]==$array[$j]["b"])
                $x=true;

        if(!$x)
            $new_array[]=$array[$i];
     }  

    return new_array;
}

答案 2 :(得分:0)

如果您发现问题很有用,这是您的问题的解决方案: -

    }
    int multiply (int a){
        return 5 * a;
    }
    void run()
    {
        int threadCount = 5;
        Task[] workers = new Task[threadCount];

        Task.Factory.StartNew(consumer);

        for (int i = 0; i < threadCount; ++i)
        {
            int workerId = i;
            Task task = new Task(() => worker(workerId));
            workers[i] = task;
            task.Start();
        }

        for (int i = 0; i < 100; ++i)
        {
            Console.WriteLine("Queueing work item {0}", i);
            inputQueue.Add(i);
            Thread.Sleep(50);
        }

        Console.WriteLine("Stopping adding.");
        inputQueue.CompleteAdding();
        Task.WaitAll(workers);
        outputQueue.CompleteAdding();
        Console.WriteLine("Done.");

        Console.ReadLine();
    }

    void worker(int workerId)
    {
        Console.WriteLine("Worker {0} is starting.", workerId);

        foreach (int workItem in inputQueue)
        {
            int b= multiply(workItem);
            data.Add(b);
            Console.WriteLine("Worker {0} is processing item {1}." ,workerId,b);
            Thread.Sleep(100);          // Simulate work.
            outputQueue.Add(workItem);  // Output completed item.
        }

        Console.WriteLine("Worker {0} is stopping.", workerId);
    }

    void consumer()
    {
        Console.WriteLine("Consumer is starting.");

        foreach (var workItem in outputQueue.GetConsumingEnumerable())
        {
            Console.WriteLine("Consumer is using item {0}", workItem);
            Thread.Sleep(25);
        }

        Console.WriteLine("Consumer is finished.");
    }

    BlockingCollection<int> inputQueue = new BlockingCollection<int>();
    BlockingCollection<int> outputQueue = new BlockingCollection<int>();
}