2011-07-12 32 views
0

我一整天都在爲這個問題而頭痛。 我怎樣才能改變以下數組:將陣列轉換成更小的陣列

Array 
(
[0] => Array 
    (
     [compId] => 3081 
     [category] => Products 
     [rev] => 0.61 
    ) 

[1] => Array 
    (
     [compId] => 3080 
     [category] => Plants 
     [rev] => 51 
    ) 

[2] => Array 
    (
     [compId] => 3080 
     [category] => Products 
     [rev] => 6.1 
    ) 
) 

到一個數組這種格式:

Array( 
'compId'=>array("3081","3080"), 
'Products'=>array('0.61', '6.1'), 
'Plants'=>array('0', '51') 
); 

前者是由一個函數返回。請注意後一個數組中的0不在前一個數組中。但是,我需要保留關鍵的價值。我一直在嘗試幾個數組函數來使它工作,但我似乎不能解決問題。 任何幫助將非常感激。

讓我試試一下。後一個數組用作輸入來創建表。 表看起來像什麼爲:

 
CompID | Products | Plants 
__________________________ 
3081 | 0.61  | 0 
__________________________ 
3080 | 6.1  | 51 
+0

一些for循環也許... – Treffynnon

+1

也許你可以解釋如何從前者到後者的邏輯?這不是很明顯。 – deceze

回答

1

如果我沒有理解所期望的結果:

$result = array(); 

foreach ($array as $item) { 
    $result['compId'][] = $item['compId']; 
    $result[$item['category']][] = $item['rev']; 
} 

print_r($result); 
+0

感謝,不完全是我正在尋找,但你讓我看着正確的方向。我仍然需要省略double值(比如compId 3080),並添加「0」來保持鍵值不變。 –

0

這就是我所理解的理想的結果,問題滴從數組中的一個項目,所以我我不完全確定。它改變了密鑰,所以可能需要更高一些關鍵別名:

foreach ($array as $item) 
    foreach($item as $key => $value) 
     $result[$key][] = $value 
; 
0
$categories = array_unique(array_map(function ($elem) { return $elem['category']; }, $array)); 
$tableRows = array('compId' => array_values(array_unique(array_map(function ($elem) { return $elem['compId']; }, $array)))); 

foreach ($tableRows['compId'] as $i => $compId) { 
    foreach ($categories as $category) { 
     $tableRows[$category][$i] = 0; 
     foreach ($array as $elem) { 
      if ($elem['category'] == $category && $elem['compId'] == $compId) { 
       $tableRows[$category][$i] = $elem['rev']; 
       break; 
      } 
     } 
    } 
} 

我敢肯定,這可以不通過至少針對不同陣列格式進一步優化,但這應該工作。