0

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

我很难想出一种干净有效的方法来做到这一点。有谁能帮帮我吗?我无法针对这个问题指出类似的问题。

假设我有一个数组:

 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
4

1 回答 1

0

我认为您可以使用以下功能: 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.

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

于 2013-07-11T21:19:51.933 回答