Php 基于过滤器ID的过滤器产品
你好 我有一个数组(请求) 然后我将所有产品按过滤器类别分组(我知道这是json输出,但更易于共享) 如果$appliedFilters与过滤器完全相同,我如何返回所有产品 我只需要$appliedFilters与filterCategories完全相同的产品 例如,给定的Php 基于过滤器ID的过滤器产品,php,Php,你好 我有一个数组(请求) 然后我将所有产品按过滤器类别分组(我知道这是json输出,但更易于共享) 如果$appliedFilters与过滤器完全相同,我如何返回所有产品 我只需要$appliedFilters与filterCategories完全相同的产品 例如,给定的$appliedFilters应该返回0个产品,因为没有带有过滤器40或41的产品 第二个示例 $appliedFilters = [ "6", "36", "48" ] 在这种情况下,应该返回pro
$appliedFilters
应该返回0个产品,因为没有带有过滤器40或41的产品
第二个示例
$appliedFilters = [
"6",
"36",
"48"
]
在这种情况下,应该返回product_id=12的产品,因为所有$appliedFilters
都有该产品。如果该产品也有更多的过滤器,如7和48,这应该无关紧要
到目前为止,我所尝试的是,但预期的结果并不正确:
// fetch all filter items
$productsGroupByFilterItems = [];
$rows = $this->getFilters();
foreach ($rows as $row) {
$productsGroupByFilterItems[$row['filterItem_id']] = [];
}
// group all products by filter ids
foreach ($products as $product) {
$productFilters = explode(',', $product['chosenFilterIds']);
foreach ($productsGroupByFilterItems as $filterItemId => $filterItem) {
foreach ($productFilters as $filterId) {
if ($filterId == $filterItemId) {
$productsGroupByFilterItems[$filterItemId][] = $product;
}
}
}
}
// remove all products that are not part of the applied filters
foreach($productsGroupByFilterItems as $key => $val)
{
if(array_search($key, $appliedFilters) === false)
{
unset($productsGroupByFilterItems[$key]);
}
}
// finally return only the products that exist in all the filters items
return call_user_func_array('array_intersect_key', $productsGroupByFilterItems);
代码太复杂,无法解析,但这可能会给您一个开始 假设产品作为PHP数组存在于
$products
中,只需翻转$appliedFilters
创建键,然后计算键的交点:
$result = array_intersect_key(array_flip($appliedFilters), $products);
这将为您提供
$products
中的所有项目,其中键位于$appliedFilters
中。要做相反的事情,请看。您应该这样做(我将您的JSON转换为简单数组)
结果如下:
//case 1
array(0) {
}
//case 2
array(1) {
[0]=>
array(1) {
["product_id"]=>
int(12)
}
}
你可以在这里看到它的作用:
基本上,我们将过滤数组的键与过滤键相交。然后在一个循环中交叉所有产品阵列。您应该从正确解释数据模型开始。并给出实际有意义的例子。(第二个示例中的48似乎根本不存在于您的筛选数据中。那么这是简单地忽略,还是…?)“然后我将所有产品按筛选类别分组”-您自己创建的,它不是您的原始输入数据?在这种情况下,也许可以使用一种更适合你想要达到的目标的结构来开始…?你放弃了吗?
$result = array_intersect_key(array_flip($appliedFilters), $products);
$filteredData = [
6 => [
['product_id' => 12]
],
7 => [
['product_id' => 12]
],
12 => [],
48 => [
['product_id' => 12]
],
33 => [],
34 => [],
35 => [],
36 => [
['product_id' => 12]
],
37 => [
['product_id' => 12]
],
38 => [],
39 => [],
40 => [],
41 => []
];
//case 1
$appliedFilters = [
"6",
"37",
"40",
"41"
];
$out = array_intersect_key($filteredData, array_flip($appliedFilters));
$products = null;
foreach ($out as $filteredProducts) {
if ($products === null) {
$products = $filteredProducts;
continue;
}
$products = @array_intersect($products, $filteredProducts);
}
var_dump($products);
//case 1
$appliedFilters = [
"6",
"36",
"48"
];
$out = array_intersect_key($filteredData, array_flip($appliedFilters));
$products = null;
foreach ($out as $filteredProducts) {
if ($products === null) {
$products = $filteredProducts;
continue;
}
$products = @array_intersect($products, $filteredProducts);
}
var_dump($products);
//case 1
array(0) {
}
//case 2
array(1) {
[0]=>
array(1) {
["product_id"]=>
int(12)
}
}