合并数组,使它们只包含重复出现的值
Merge arrays so they contain only recurring values
我们正在升级网上商店,因此过滤方式略有不同。现在我们只需获取与一个或多个 selected 过滤器值相关的所有产品 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' 值来自同一个过滤器 'Processor',因此我们希望将这些值结合起来,因为访问者希望所有产品都带有 AMD E 或 INTEL处理器。
现在我们只想 select 两个数组中都出现的 ID。到目前为止,我们已经尝试了很多方法,只是 return 在任何尝试中都没有达到我们的预期。
问题在于 $result
中键 => 数组对的数量是动态的,就像 SQL 编辑的 ID return 的数量一样。当 $result
中的第一个数组是 ID 的简短列表时,当 $result
中有多个数组时,array_intersect()
将不会 return 所有预期结果。
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 完成工作。正如您在 中所读到的,没有任何运气。
以前有人解决过类似的问题吗?
据我了解,您希望有一个两步流程:
- 查找与给定过滤器组中的任何条件匹配的所有项目
- 查找在所有使用的过滤器组
中return编辑的项目
第一步,您需要找到与每个所选选项相匹配的产品。例如。如果用户搜索具有选项 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。
您需要做的最后一件事是检查用户是否选择了任何过滤器。如果不是,请不要应用以上逻辑,但 return 所有产品。
希望对您有所帮助:)
我们正在升级网上商店,因此过滤方式略有不同。现在我们只需获取与一个或多个 selected 过滤器值相关的所有产品 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' 值来自同一个过滤器 'Processor',因此我们希望将这些值结合起来,因为访问者希望所有产品都带有 AMD E 或 INTEL处理器。
现在我们只想 select 两个数组中都出现的 ID。到目前为止,我们已经尝试了很多方法,只是 return 在任何尝试中都没有达到我们的预期。
问题在于 $result
中键 => 数组对的数量是动态的,就像 SQL 编辑的 ID return 的数量一样。当 $result
中的第一个数组是 ID 的简短列表时,当 $result
中有多个数组时,array_intersect()
将不会 return 所有预期结果。
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 完成工作。正如您在
以前有人解决过类似的问题吗?
据我了解,您希望有一个两步流程:
- 查找与给定过滤器组中的任何条件匹配的所有项目
- 查找在所有使用的过滤器组 中return编辑的项目
第一步,您需要找到与每个所选选项相匹配的产品。例如。如果用户搜索具有选项 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。
您需要做的最后一件事是检查用户是否选择了任何过滤器。如果不是,请不要应用以上逻辑,但 return 所有产品。
希望对您有所帮助:)