Structure $data->products
(There are about 10,000 products). Each of the products has parameters.
Array
(
[0] => Array
(
[id] => 440
[name] => Product1
[parameters] => Array
(
[0] => Array
(
[id] => 1
[name] => Parameter1
[value] => Array
(
[0] => Array
(
[id] => 1
[name] => ValueParameter1
)
)
)
[1] => Array
(
[id] => 2
[name] => Parameter2
[value] => Array
(
[0] => Array
(
[id] => 2
[name] => ValueParameter2
)
)
)
[2] => Array
(
[id] => 3
[name] => Parameter3
[value] => Array
(
[0] => Array
(
[id] => 3
[name] => ValueParameter3
)
)
)
[3] => .........
...
)
)
[1] => Array
(
[id] => 14
[name] => Product2
[parameters] => Array
(
[0] => Array
(
[id] => 2
[name] => Parameter2
[value] => Array
(
[0] => Array
(
[id] => 2
[name] => ValueParameter2
)
)
)
[2] => Array
(
[id] => 3
[name] => Parameter3
[value] => Array
(
[0] => Array
(
[id] => 3
[name] => ValueParameter3
)
)
)
[2] => Array
(
[id] => 35
[name] => Parameter35
[value] => Array
(
[0] => Array
(
[id] => 64
[name] => ValueParameter35
)
)
)
[3] => .........
...
)
)
[2] => ....
.....
What do I want to get?
$data->products
is an array to be filtered on.$filterContains
parameters ID array - filtering products that contain parameters with given IDs.$filterExclude
parameters ID array - filtering products excluding the specified IDs.
I want to get an array of products taking into account the IDs of the parameters, which are specified in the filter arrays ($filterContains
& $filterExclude
).
Products that contain parameters,$filterContains
, excluding parameters from $filterExclude
.
Code:
function getFilteredData($data, array $filterContains = [], array $filterExclude = []): array
{
$result = [];
$keyCount = count($filterContains);
foreach ($data->products as $product) {
if (isset($product['parameters'])) {
$match = 0;
$product['parameters'] = array_values($product['parameters']);
foreach ($product['parameters'] as $parameter) {
foreach ($filterContains as $value) {
if ($parameter['id'] == $value && !in_array($parameter['id'], $filterExclude)) {
$match++;
}
}
if ($match == $keyCount) {
$result[] = $product;
}
}
}
}
$unique_array = [];
foreach ($result as $element) {
$hash = $element['id'];
$unique_array[$hash] = $element;
}
$result = array_values($unique_array);
return $result;
}
It seems to me only works for products that contain the given parameters, but it doesn't exclude the parameters given in $filterExclude
.
I hope I have described the problem quite clearly. Regards.