【问题标题】:How to get the intersection of an array of multidimensional arrays?如何获得多维数组的交集?
【发布时间】:2015-07-03 22:56:08
【问题描述】:

我有一个多维数组。每个数组代表一个搜索结果集。我试图弄清楚如何过滤这组数据以仅包含每个数组中存在的数组。

注意:下面显示的索引分别代表多维数组。每个数组都有一个深度嵌套的 Id 键,可用于比较。

Id 位于:

$reference_variable['data']['Id'][0]

例如,

array(
    array([0], [19], [21], [148]),
    array([2], [21], [32], [44], [432], [549]),
    array([13], [21], [148])
)

应该返回:

array(
    [21]
)

和:

array(
    array([0], [12], [15]),
    array([2], [21], [32], [44], [432], [549]),
    array([13], [21], [148])
)

应该返回:

array(
    []
)

处理此问题的最佳方法是什么? array_intersect 不适用于多维数组。

我已经尝试将所有Ids 存储在一个数组中,并使用array_count_values 查找重复的Ids,然后使用array_filter 比较当前数组的Id 是否相等到任何重复的Id

但事实证明这是完全错误的,因为这种方法允许:

array(
    array([0], [19], [21], [148]),
    array([2], [21], [32], [44], [432], [549]),
    array([13], [21], [148])
)

返回:

array(
    [21, 148]
)

不是所有数组的交集。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    只需将第一个数组的索引存储在数组中。检查第二个数组上的匹配索引并将它们存储在第二个数组 A2 中。检查第二个存储数组 (A2) 和第三个数组之间的匹配项。将其称为 A3 以保持一致性( A3 )。这是你的答案。

    大概 10-20 行代码。

    【讨论】:

      【解决方案2】:

      这就是我的答案:

      $params = array_merge($array_of_arrays, array('array_compare'));
      
      $intersection = call_user_func_array('array_uintersect', $params);
      
      function array_compare($a1, $a2) 
      {
          if ($a1 === $a2) {
              return 0;
          }
          if ($a1 > $a2) {
              return 1;
          }
          return -1;
      }
      

      信用:https://stackoverflow.com/a/2020654/1911755

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 2016-03-23
        相关资源
        最近更新 更多