合并数组,使它们只包含重复值

时间:2015-07-14 13:59:54

标签: php arrays webshop

我们正在升级网上商店,因此过滤有点不同。现在,我们只需获取与一个或多个所选过滤器值相关的所有产品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'和'英特尔'值来自同一过滤器'处理器'所以我们希望这些结合在一起,因为访问者希望所有产品都配备AMD E OR INTEL处理器。

现在我们只想选择两个阵列中出现的ID。我们现在已经尝试了很多方法,但它并没有在任何尝试中返回我们所期望的。

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

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

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

激活更多过滤器后事情变得复杂: (' 8 GB'或' 12 GB')和(' ADM E' OR' INTEL')和(' HP&# 39;或者' Apple' OR' Sony')

(希望我没有解释你试图解释现状和我们现在要做的事情:s)

我们也尝试通过SQL完成工作。你可以在没有任何运气的情况下阅读this question

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

1 个答案:

答案 0 :(得分:3)

据我了解,您希望有两个步骤:

  1. 查找与给定过滤器组中的任何条件匹配的所有项目
  2. 查找在所有使用过滤器组中返回的项目
  3. 首先,您需要找到与所选选项相匹配的产品。例如。如果用户搜索具有任何选项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。

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

    我希望它有帮助:)