2015-11-19 127 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來做這件事情會更好。