1

我们正在升级一个网上商店,所以过滤有点不同。现在我们只需获取与一个或多个选定过滤器值相关的所有产品 ID。

//Filter value '8 GB'
$result[] = array(1,6,5,8,9);

//Filter value 'AMD E' (and)OR 'INTEL'
$result[] = array(1,5,8,9,10,500,502,503,600,607,608,...);

“AMD E”和“INTEL”值来自同一个过滤器“处理器”,因此我们希望将它们结合起来,因为访问者希望所有产品都带有 AMD E 或 INTEL 处理器。

现在我们只想选择出现在两个数组中的 ID。到目前为止,我们已经尝试了很多方法,但它在任何尝试中都没有返回我们期望的结果。

问题在于 key => 数组对$result的数量是动态的,就像 SQL 返回的 ID 数量一样。当 in 的第一个数组$result是一个简短的 ID 列表时,array_intersect()当 in 有多个数组时,不会返回所有预期结果$result

merge_array()只会结合一切。因此,访问者将看到所有具有 8 GB 内存或包含 AMD E 或 INTEL 处理器的产品。

我们正在寻找 ('8 GB') AND ('ADM E' OR 'INTEL') 解决方案。

当更多过滤器被激活时,事情变得复杂了:('8 GB' OR '12 GB') AND ('ADM E' OR 'INTEL') AND ('HP' OR 'Apple' OR 'Sony')

(希望我没有让你试图解释情况以及我们现在正在尝试做的事情:s)

我们还尝试过通过 SQL 完成工作。正如您可以在没有任何运气的情况下阅读这个问题一样。

以前有人处理过这样的事情吗?

4

1 回答 1

3

据我了解,您希望有一个两步过程:

  1. 查找与给定过滤器组中的任何条件匹配的所有项目
  2. 查找在所有使用的过滤器组中返回的项目

第一步,您需要找到与每个选定选项匹配的产品。例如,如果用户搜索具有任何选项 A、B 或 C 的产品,则将结果放在一个数组中,例如:

$results = [
 [1,2,3], // products that have option A
 [2,5,7], // products that have option B,
 [2,7,10] // products that have option C
];

您现在可以使用以下方式获取具有任何这些选项的所有产品的 ID

$ids = call_user_func_array('array_merge', $results);

这将为您提供数组的总和。

您必须为用户选择的每个过滤器组执行此操作,您将获得另一个数组数组,现在您需要在其上执行交集操作:

$result = [
  $ids1, // array of IDs that match ANY option from filter group 1
  $ids2  // array of IDs that match ANY option from filter group 2
];

您可以通过以下方式获得交叉路口:

$ids = call_user_func_array('array_intersect', $results);

这将为您提供与所有选定过滤器组中的任何过滤器选项匹配的产品 ID。

您需要做的最后一件事是检查用户是否选择了任何过滤器。如果不是,请不要应用上述逻辑,而是退回所有产品。

我希望它有帮助:)

于 2015-07-14T14:05:44.653 回答