Php 基于过滤器ID的过滤器产品

Php 基于过滤器ID的过滤器产品,php,Php,你好 我有一个数组(请求) 然后我将所有产品按过滤器类别分组(我知道这是json输出,但更易于共享) 如果$appliedFilters与过滤器完全相同,我如何返回所有产品 我只需要$appliedFilters与filterCategories完全相同的产品 例如,给定的$appliedFilters应该返回0个产品,因为没有带有过滤器40或41的产品 第二个示例 $appliedFilters = [ "6", "36", "48" ] 在这种情况下,应该返回pro

你好

我有一个数组(请求)

然后我将所有产品按过滤器类别分组(我知道这是json输出,但更易于共享)

如果$appliedFilters与过滤器完全相同,我如何返回所有产品

我只需要$appliedFilters与filterCategories完全相同的产品

例如,给定的
$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)
  }
}