2015-04-22 77 views
-1

我有以下数组,在这个数组中有相同的日期为键112. 我需要添加那些日期相同的数组。在PHP中添加匹配数组键值params

Array 
(
[0] => Array 
    (
     [112] => 2015-02-17 
     [97] => 20.00 
     [84] => 13.00 
    ) 

[1] => Array 
    (
     [112] => 2015-02-17 
     [97] => -5 
     [84] => 0 
    ) 

[2] => Array 
    (
     [112] => 2015-02-17 
     [97] => -5 
     [84] => 0 
    ) 

[3] => Array 
    (
     [112] => 2015-03-17 
     [97] => 10 
     [84] => 0 
    ) 

[4] => Array 
    (
     [112] => 2015-03-17 
     [97] => -5 
     [84] => 0 
    ) 

[5] => Array 
    (
     [112] => 2015-03-17 
     [97] => -5 
     [84] => 0 
    ) 

[6] => Array 
    (
     [112] => 2015-01-17 
     [97] => 2 
     [84] => 0 
    ) 

[7] => Array 
    (
     [112] => 2015-01-17 
     [97] => 13 
     [84] => 0 
    ) 

[8] => Array 
    (
     [112] => 2015-01-17 
     [97] => 2 
     [84] => 0 
    ) 
) 

例如从上方阵列I需要以下结果:

Array 
(
[0] => Array 
    (
     [112] => 2015-02-17 
     [97] => 10.00 
     [84] => 13.00 
    ) 

[1] => Array 
    (
     [112] => 2015-03-17 
     [97] => 0 
     [84] => 0 
    ) 

[2] => Array 
    (
     [112] => 2015-01-17 
     [97] => 17 
     [84] => 0 
    ) 
) 

在此所得的阵列我需要除了那些数组,其112键值是日期是相同的。

我有这样的成千上万的记录。所以请建议简单和最快的方式。另外我需要保留所有内部数组的键。

+0

你需要保持原来的结构? – dbinns66

+0

是...与我给出的结果数组相同 – Amol

回答

1

您需要使用foreach循环并迭代数组中的每个元素。

$array = array(
    array(
    112 => '2015-02-17', 
    97 => 20, 
    84 => 13 
), 
    array(
    112 => '2015-02-17', 
    97 => -5, 
    84 => 13 
), 
    array(
    112 => '2015-02-17', 
    97 => -5, 
    84 => 13 
), 
    array(
    112 => '2015-02-18', 
    97 => 10, 
    84 => 13 
), 
    array(
    112 => '2015-02-18', 
    97 => 10, 
    84 => 13 
), 
); 


$result = array(); 
foreach ($array as $item) { 
    if (isset($result[$item[112]])) { 
    foreach ($item as $key => $value) { 
     if ($key != 112) { # we don't need to sum 'date column' 
     if (isset($result[$item[112]][$key])) { 
      $result[$item[112]][$key] += $value; 
     } else { 
      $result[$item[112]][$key] = $value; 
     } 
     } 
    } 
    } else { 
    $result[$item[112]] = $item; 
    } 
} 

print_r(array_values($result)); 
+0

Thanx很多亲爱的...它工作welll – Amol

1

我想操纵阵列所以112项的值是新的数组的键和值是每个项目的在于该112值匹配的原始列表。然后遍历它检查数组中是否有多于一个的项目,如果是这样的话求和。即

$data = array(...); // all your source data 
$matches = array(); 
$results = array(); 

// reformat data into an associative array 
foreach($data as $item) { 
    if(!array_key_exists($item[112], $matches)} { 
     $matches[$item[112]] = array(); 
    } 
    $matches[$item[112]][] = $item; 
} 

foreach($matches as $items) { 
    if(count($items) == 1) 
     continue; // if we don't have at least 2 matching 112's, skip 
    $sum = array(); 
    foreach($items as $item) 
    { 
     // iterate over each key, and add it to the array 
     foreach($item as $key => $value) 
     { 
      if($key == 112) 
       $sum[$key] = $value; // assign 112, don't add it again 

      if(array_key_exists($key, $sum)) 
       $sum[$key] += $value; 
      else 
       $sum[$key] = $value; 
     } 
    } 
    $results[] = $sum; // add sum to list of sum'ed items 
} 
// $results now contains any matches sum'ed together 

我没有测试,但应该工作

+0

更新我的原始答案,注意到一些错别字 –