2015-11-19 121 views
1

我有一个数组,用PHP我需要从该数组中删除“listingCode”上的所有非重复。例如:删除所有非重复数组php

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 

由于

+0

有你累了些什么呢?另外为什么不保留元素3和4? – Rizier123

+0

重复只能在“productName”中。修正了我的帖子。我没有尝试过任何东西,我不知道从哪里开始。 – LargeTuna

+0

我还是不太明白。产品名称0和1是一样的,那么为什么你想保留它?使用谷歌,使用手册尝试一些代码,直到你卡住,直到你的目标。 – Rizier123

回答

1

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

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 
+0

你是我的编码救星!非常感谢。 – LargeTuna

2

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)在回调并返回一个true我F时是大于1条的匹配记录,表明这一应在滤波之后被保留

和肯定的,它不保留原始键


然而,利用1.2M记录数组正在一个巨大的大量的PHP宝贵的内存,并且对于那些数据量来说,过滤速度会非常慢......通过SQL来做这件事情会更好。