PHP 按照多個鍵值給數組分組合並


簡介:

$array 為一堆數組,各數組鍵值為固定

$keys為分組依據,在$array中按照$keys所指定的鍵值將數組分組,並且將除$keys指定鍵值對應的值以外的值合並

  1 function groupBy($array,$keys){
  2     $i = 0;
  3     while($i < sizeof($array)){
  4         $x = sizeof($array) - 1;
  5         while ($x > $i) {
  6             //取數組交集並返回交集,保留鍵名
  7             $temp = array_intersect_assoc($array[$i],$array[$x]);
  8             if(!empty($temp)){
  9                 // 取鍵名交集,並做比較,如果相交等於分組依據的鍵名,則說明兩個子數組可以合並
 10                 if(array_intersect_assoc($keys,array_keys($temp)) == $keys){
 11                     foreach ($array[$i] as $k => $v) {
 12                         if(!in_array($k,$keys)){
 13                             $array[$i][$k] += $array[$x][$k];
 14                         }
 15                     }
 16                     //將合並部分移出數組
 17                     array_splice($array,$x,1);
 18                 }
 19             }
 20             $x--;
 21         }
 22         $i++;
 23     }
 24     return $array;
 25 }
 26 
 27 //測試:
 28 $arr = array(
 29         array(
 30             'province' => 'Guangdong',
 31             'city' => 'Guangzhou',
 32             'num1' => 25,
 33             'num2' => 15,
 34             'num3' => 43,
 35         ),
 36         array(
 37             'province' => 'Guangdong',
 38             'city' => 'Guangzhou',
 39             'num1' => 25,
 40             'num2' => 15,
 41             'num3' => 43,
 42         ),
 43         array(
 44             'province' => 'Guangdong',
 45             'city' => 'Guangzhou',
 46             'num1' => 33,
 47             'num2' => 24,
 48             'num3' => 32,
 49         ),
 50         array(
 51             'province' => 'Jiangsu',
 52             'city' => 'Nanjing',
 53             'num1' => 25,
 54             'num2' => 115,
 55             'num3' => 423,
 56         ),
 57         array(
 58             'province' => 'Jiangsu',
 59             'city' => 'Nanjing',
 60             'num1' => 0,
 61             'num2' => 15,
 62             'num3' => 1,
 63         ),
 64         array(
 65             'province' => 'Jiangsu',
 66             'city' => 'Nanjing',
 67             'num1' => 5,
 68             'num2' => 2,
 69             'num3' => 4,
 70         ),
 71         array(
 72             'province' => 'Jiangsu',
 73             'city' => 'Nanjing',
 74             'num1' => 5,
 75             'num2' => 2,
 76             'num3' => 4,
 77         ),
 78         array(
 79             'province' => 'Jiangsu',
 80             'city' => 'Nanjing',
 81             'num1' => 5,
 82             'num2' => 2,
 83             'num3' => 4,
 84         ),
 85         array(
 86             'province' => 'Guangdong',
 87             'city' => 'Guangzhou',
 88             'num1' => 1,
 89             'num2' => 2,
 90             'num3' => 3,
 91         ),
 92         array(
 93             'province' => 'Shanghai',
 94             'city' => 'Shanghai',
 95             'num1' => 25,
 96             'num2' => 15,
 97             'num3' => 43,
 98         ),
 99                 array(
100             'province' => 'Jiangsu',
101             'city' => 'Nanjing',
102             'num1' => 25,
103             'num2' => 15,
104             'num3' => 43,
105         ),
106         array(
107             'province' => 'Henan',
108             'city' => 'Zhengzhou',
109             'num1' => 25,
110             'num2' => 15,
111             'num3' => 43,
112         ),
113         array(
114             'province' => 'Hunan',
115             'city' => 'Changsha',
116             'num1' => 25,
117             'num2' => 15,
118             'num3' => 43,
119         ),
120         array(
121             'province' => 'Hunan',
122             'city' => 'Changsha',
123             'num1' => 3,
124             'num2' => 4,
125             'num3' => 5,
126         ),
127     );
128 $keys = array(
129         'province',
130         'city'
131     );
132 $arr = groupBy($arr,$keys);

輸出:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM