2014-09-30 96 views
-1

我一直试图分组在PHP中的倍数值的数组的一个问题...分组阵列由具有多个值的字段在PHP

鉴于像数组:

$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3); 
$in[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4); 
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4); 
$in[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 4); 
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3); 
$in[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 3); 

我想要得到:

$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '2', 'quantity' => 3); 
$out[] = array('year' => '2010', 'month' => '11', 'grupo' => '3', 'quantity' => 4); 
$out[] = array('year' => '2011', 'month' => '2', 'grupo' => '2', 'quantity' => 8); 
$out[] = array('year' => '2012', 'month' => '3', 'grupo' => '4', 'quantity' => 6); 

我已经试过这样的事情:

$out = array(); 
foreach ($in as $row) { 
    if (!isset($out[$row['year']['month']['grupo']])) { 
     $out[$row['year']['month']['grupo']] = array(
      'year' => $row['year'], 
      'month' => $row['month'], 
      'grupo' => $row['grupo'], 
      'quantity' => 0, 
     ); 
    } 
    $out[$row['year']['month']['grupo']]['quantity'] += $row['quantity']; 
} 
$out = array_values($out); 

但它失败3组字段。

如果有人可以帮助我,它会大大超过它!

回答

1

试试这个:

$out = array(); 
foreach ($in as $row) { 
    if(! isset($out[$row['year']][$row['month']][$row['grupo']])) { 
     $out[$row['year']][$row['month']][$row['grupo']]=0; 
    } 
    $out[$row['year']][$row['month']][$row['grupo']] += $row['quantity']; 
} 
print_r($out); 

它将输出所需的价值观,但作为一个多维数组值,而不是作为一个扁平阵列键=>值对:

Array 
(
    [2010] => Array 
     (
      [11] => Array 
       (
        [2] => 3 
        [3] => 4 
       ) 

     ) 

    [2011] => Array 
     (
      [2] => Array 
       (
        [2] => 8 
       ) 

     ) 

    [2012] => Array 
     (
      [3] => Array 
       (
        [4] => 6 
       ) 

     ) 

) 

,但你可以重新安排你的阵列:

$out2 = array(); 
foreach($out as $year => $year_array) { 
    foreach($year_array as $month => $month_array) { 
    foreach($month_array as $grupo => $quantity) { 
     $out2[] = array('year' => $year, 'month' => $month, 'grupo' => $grupo, 'quantity' => $quantity); 
    } 
    } 
} 
print_r($out2); 

这将输出:

Array 
(
    [0] => Array 
     (
      [year] => 2010 
      [month] => 11 
      [grupo] => 2 
      [quantity] => 3 
     ) 

    [1] => Array 
     (
      [year] => 2010 
      [month] => 11 
      [grupo] => 3 
      [quantity] => 4 
     ) 

    [2] => Array 
     (
      [year] => 2011 
      [month] => 2 
      [grupo] => 2 
      [quantity] => 8 
     ) 

    [3] => Array 
     (
      [year] => 2012 
      [month] => 3 
      [grupo] => 4 
      [quantity] => 6 
     ) 

) 
+0

感谢您的答复,但我通过数量需要排序,我想使用: 的foreach($出为$关键=> $行){ $ aux [$ key] = $ row ['quantity']; } array_multisort($ aux,SORT_DESC,$ out); – Gonzalo1987 2014-09-30 17:42:09

+0

我以为你会独自解决,但在这里。 – hellcode 2014-09-30 17:45:50

+0

我没有意识到,你是对的,Tyvm! – Gonzalo1987 2014-09-30 17:49:14

0

这将保留值并给出总和。

foreach($in as $row) { 
      $out[$row['year']][$row['month']][$row['grupo']]['quantity'][] = $row['quantity']; 
      $out[$row['year']][$row['month']][$row['grupo']]['sum']   = array_sum($out[$row['year']][$row['month']][$row['grupo']]['quantity']); 
     } 

print_r($out); 

GIVES

Array 
(
    [2010] => Array 
     (
      [11] => Array 
       (
        [2] => Array 
         (
          [quantity] => Array 
           (
            [0] => 3 
           ) 

          [sum] => 3 
         ) 

        [3] => Array 
         (
          [quantity] => Array 
           (
            [0] => 4 
           ) 

          [sum] => 4 
         ) 

       ) 

     ) 

    [2011] => Array 
     (
      [2] => Array 
       (
        [2] => Array 
         (
          [quantity] => Array 
           (
            [0] => 4 
            [1] => 4 
           ) 

          [sum] => 8 
         ) 

       ) 

     ) 

    [2012] => Array 
     (
      [3] => Array 
       (
        [4] => Array 
         (
          [quantity] => Array 
           (
            [0] => 3 
            [1] => 3 
           ) 

          [sum] => 6 
         ) 

       ) 

     ) 

)