从php数组中删除所有非重复项
我有一个数组,使用php我需要从这个数组中删除“listingCode”上的所有非重复项。例如:从php数组中删除所有非重复项,php,arrays,Php,Arrays,我有一个数组,使用php我需要从这个数组中删除“listingCode”上的所有非重复项。例如: Array ( [0] => Array ( [name] => Supplier A [listingCode] => ABC ) [1] => Array ( [name] => Supplier B [listingCode] => ABC )
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
)
)
我在这个数组中有120万条记录。基本上,当所有这些都说了又做了,我只想在数组中保留元素0,1,5,6。这可能吗
基本上所有这些数据都来自3个表。我只想显示任何列表代码可能重复的供应商。例如,列表代码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
Thank是一个标准的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
,指示在筛选后应保留该记录
是的,它确实保留了原始密钥
然而,一个包含120万条记录的数组占用了大量PHP宝贵的内存,而对于如此大的数据量,过滤速度会非常慢。。。。通过SQL执行此操作会更好。是一个标准的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
,指示在筛选后应保留该记录
是的,它确实保留了原始密钥
然而,一个包含120万条记录的数组占用了大量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
这并不能完全回答您的问题,但我决定尝试提供一种替代方法,以生成可能更有用的数据结构
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
你累了吗?还有,为什么不保留元素3和4?重复项只能在“productName”中。修正了我的帖子。我什么都没试过,我不知道从哪里开始。我还是不太明白。0和1的产品名称相同,为什么要保留它?使用谷歌,使用手册,尝试一些代码来实现你的目标,直到你陷入困境。你不认为我用谷歌搜索了什么或尝试了什么吗?我被卡住了,所以这篇文章。没有理由发布几英里糟糕的php代码,并将一些解释非常简单但很难实现的东西弄得乱七八糟。“ABC和ABCDEF”是相同的,因此0,1,5,6需要保留所有其他内容。我再清楚不过了。如果你有一个SOF帖子,我可以参考我所有的资料来整理。这些数据是来自数据库吗?如果是这样的话,在你的查询中这样做可能会更容易,而且几乎肯定会更快。你累了吗?还有,为什么不保留元素3和4?重复项只能在“productName”中。修正了我的帖子。我什么都没试过,我不知道从哪里开始。我还是不太明白。0和1的产品名称相同,为什么要保留它?使用谷歌,使用手册,尝试一些代码来实现你的目标,直到你陷入困境。你不认为我用谷歌搜索了什么或尝试了什么吗?我被卡住了,所以这篇文章。没有理由发布几英里糟糕的php代码,并将一些解释非常简单但很难实现的东西弄得乱七八糟。“ABC和ABCDEF”是相同的,因此0,1,5,6需要保留所有其他内容。我再清楚不过了。如果你有一个SOF帖子,我可以参考我所有的资料来整理。这些数据是来自数据库吗?如果是这样的话,在你的查询中这样做可能会更容易,而且几乎肯定会更快。你是我的编码救世主!非常感谢。你是我的救世主!非常感谢。