多维关联数组,与PHP相结合


Multidimensional associative arrays, combining with PHP

看到下面的代码,当多个记录中的状态、编号和日期相同时,我想将记录组合起来,并将不同的版本号组合成一个元素,在一个组合的数组元素中,希望下面的例子能更好地解释我想要的。

我很难想出一个干净高效的方法来做到这一点。有人能帮我吗?我无法找出与这个问题类似的问题。

假设我有一个数组:

 array (size=4)
  995 => 
    array (size=4)
      'status' => string 'accept' (length=6)
      'number' => string '130106' (length=6)
      'date' => string 'July 11th, 2013' (length=15)
      'version_number' => 1
  996 => 
    array (size=4)
      'status' => string 'won' (length=3)
      'number' => string '130106' (length=6)
      'date' => string 'July 11th, 2013' (length=15)
      'version_number' => null
  993 => 
    array (size=4)
      'status' => string 'won' (length=3)
      'number' => string '130106' (length=6)
      'date' => string 'July 11th, 2013' (length=15)
      'version_number' => null
  992 => 
    array (size=4)
      'status' => string 'accept' (length=6)
      'number' => string '130106' (length=6)
      'date' => string 'July 11th, 2013' (length=15)
      'version_number' => 3

期望结果:

array (size=3)
      0 => 
        array (size=4)
          'status' => string 'accept' (length=6)
          'number' => string '130106' (length=6)
          'date' => string 'July 11th, 2013' (length=15)
          'version_number' => array (1, 3)
      1 => 
        array (size=4)
          'status' => string 'won' (length=3)
          'number' => string '130106' (length=6)
          'date' => string 'July 11th, 2013' (length=15)
          'version_number' => null
      2 => 
        array (size=4)
          'status' => string 'won' (length=3)
          'number' => string '130106' (length=6)
          'date' => string 'July 11th, 2013' (length=15)
          'version_number' => null

我认为您可以使用以下函数:http://www.php.net/manual/en/function.array-intersect-assoc.php

循环遍历数组并检查数组的每个索引的交集。如果状态、编号和日期都有交集,则组合版本并分配回要检查的索引,然后弹出与之进行比较的索引。完成对所有其他索引的检查后,将当前索引放入新的数组中。

我将为您列出一些伪代码,因为我现在没有服务器可以访问来进行测试,只需循环遍历您的数组元素,比较应该如下所示:

array_intersect_assoc($array[995],$array[996]); -> intersect = number, date
array_intersect_assoc($array[995],$array[993]); -> intersect = number, date
array_intersect_assoc($array[995],$array[992]); -> intersect = status, number, date OK
array_push($array[995]['version'], $array[992]['version']);
unset($array[992]);
end of loop,
array_push($new_array, $array[995]);
$new_array: 0 => 
               'status' => string 'accept'
               'number' => string '130106' 
               'date' => string 'July 11th, 2013'
               'version_number' => array (1, 3)
#now loop moves on to the rest of the remaining elements.

因此,它将通过循环将所有版本累积到一个索引中,进一步删除数组中的所有冗余数据(这样我们就不会再循环了),然后在完整迭代时,将索引保存到一个新数组中。