繁体   English   中英

从Array php中删除所有非重复项

[英]Remove all non duplicates from Array php

我有一个数组,使用php我需要从这个数组中删除“listingCode”上的所有NON重复项。 例如:

Array
(
    [0] => Array
    (
        [name] => Supplier A
        [listingCode] => ABC
    )
    [1] => Array
    (
        [name] => Supplier B
        [listingCode] => ABC
    )
    [2] => Array
    (
        [name] => Supplier B
        [listingCode] => DEF
    )
    [3] => Array
    (
        [name] => Supplier C
        [listingCode] => XYZ
    )
    [4] => Array
    (
        [name] => Supplier D
        [listingCode] => BBB
    )
    [5] => Array
    (
        [name] => Supplier E
        [listingCode] => ABCDEF
    )
    [6] => Array
    (
        [name] => Supplier F
        [listingCode] => ABCDEF
    )
)

我在这个数组中有1.2M记录。 基本上当完成所有操作时,我只想在数组中留下元素0,1,5,6。 这可能吗?

基本上所有这些数据都来自3个表格。 我只想显示任何listingCode可能重复的供应商。 例如,listingCode 1,2,6,7是重复的,因此显示供应商A,B,E,F

Supplier
----------------------
ID| Supplier Name
1 | Supplier A
2 | Supplier B
3 | Supplier B
4 | Supplier C
5 | Supplier D
6 | Supplier E
7 | Supplier F

Product
----------------------
ID| Product Name | Supplier ID
1 | ABC          | 1
2 | DEF          | 2
3 | GHI          | 3
4 | JKL          | 4
5 | MNO          | 5
6 | PQR          | 6 
7 | STU          | 7

Listing
----------------------
ID| Listing Code | Product ID
1 | ABC          | 1
2 | ABC          | 2
3 | DEF          | 3
4 | XYZ          | 4
5 | BBB          | 5
6 | ABCDEF       | 6 
7 | ABCDEF       | 7

谢谢

array_filter()是一个标准的PHP函数,它允许您根据回调条件返回数组值的子集

$data = [
    ['name' => 'Supplier A', 'productName' => 'ABC'],
    ['name' => 'Supplier B', 'productName' => 'ABC'],
    ['name' => 'Supplier B', 'productName' => 'DEF'],
    ['name' => 'Supplier C', 'productName' => 'XYZ'],
    ['name' => 'Supplier D', 'productName' => 'BBB'],
    ['name' => 'Supplier E', 'productName' => 'ABCDEF'],
    ['name' => 'Supplier F', 'productName' => 'ABCDEF']
];

$result = array_filter(
    $data,
    function($value) use ($data) {
        return count(array_filter(
            $data,
            function ($match) use ($value) {
                return $match['productName'] === $value['productName'];
            }
        )) > 1;
    }
);
var_dump($result);

这依次遍历每个数组元素,执行一个回调计算原始数组中有多少重复项(基于productName ),如果有超过1个匹配记录则返回true ,表示在过滤后应该保留这个重复项

是的,它确实保留了原始密钥


但是,一个拥有1.2M记录的数组占用了大量PHP的宝贵内存,而且使用该数据量的过滤速度将非常慢......通过SQL进行此操作会更好。

这并不能完全回答您的问题,但我决定尝试提供一种替代方法,以生成可能更有用的数据结构。

foreach ($supplier_products as $item) {
    $products[$item['productName']][] = $item['name'];
}

这将生成一个数组,其中产品名称为键,每个产品名称的供应商数组为值。 然后,如果您只想要具有多个供应商的产品,您可以只计算数组过滤器中的供应商:

$duplicate_products = array_filter($products, function($product) {
    return count($product) > 1; 
});

这将最终得到一个数组:

Array ( 
    [ABC] => Array ( 
        [0] => Supplier A 
        [1] => Supplier B 
    )
    [ABCDEF] => Array (
        [0] => Supplier E 
        [1] => Supplier F
    )
)

被授予的,并不完全是你所要求的,但在我看来,这将更容易合作。


在您编辑之后,我认为此查询将为您提供包含重复列表代码的供应商列表:

SELECT
    s.supplier_name
FROM
    listing l1 
    INNER JOIN listing l2 ON l1.listing_code = l2.listing_code AND  l1.id != l2.id
    INNER JOIN product p ON l1.product_id = p.id
    INNER JOIN supplier s on p.supplier_id = s.id
GROUP BY
    s.supplier_name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM