【问题标题】:Multidimensional associative arrays, combining with PHP多维关联数组,结合PHP
【发布时间】:2013-07-10 05:24:08
【问题描述】:

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

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

假设我有一个数组:

 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

【问题讨论】:

  • “我很难想出一个干净有效的方法来做到这一点。”这意味着你已经尝试了一些东西。你能告诉我们你的尝试吗?
  • 基本上是数组复制的大杂烩,对于每个数组,并手动构建新数组。我只是觉得有一些 php 数组排序功能必须有更好的方法。

标签: php sorting multidimensional-array merge associative-array


【解决方案1】:

我认为您可以使用以下功能: 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-03-09
    • 2013-11-24
    • 2011-08-13
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多