2012-05-09 83 views
0

我有字母的名稱即分組對象的數組:拆分多維數組成列的兒童數

['A' => array(obj, obj, obj), 'B' => array(obj), 'C' => array(obj, obj), 
'D' => array(obj, obj, obj, obj, obj), 'E' => array(obj, obj, obj, obj),...] 

我試圖找到一種方法,這種陣列分成X列(2或3 )基於每個數組中的對象數量。我的例子的計數是[3, 1, 2, 5, 4]。分成三列應該給我:

array([A,B,C], [D], [E]) 

我不知道如果我處理這個問題的正確方法,或者是否有這樣做的更好的方法。

編輯: 我試圖編碼一個頁面,其中列表與標題維基百科分類,例如:http://en.wikipedia.org/wiki/Category:Arts

+0

到目前爲止你有什麼? – LeonardChallis

+0

對於分塊數組,您能更具體一些嗎? – Josh

+0

我還沒有任何東西。我不確定從哪裏開始。 – Zahymaka

回答

0

假設$input是你的對象數組的數組,$numColumns是你想要然而,許多列...

uasort($input, function($x, $y){ return count($y) - count($x); }); 
$columns = array_chunk($input, (int)ceil(count($input)/$numColumns), true); 

這個排序基於子數組長度的輸入數組,然後將其分解分成$numColumns大塊。在此之後,$columns將類似於:

0 => array(
    'B' => array(obj), 
    'C' => array(obj, obj), 
    'A' => array(obj, obj, obj) ), 
1 => array(
    'D' => array(obj, obj, obj, obj), 
    'E' => array(obj, obj, obj, obj, obj) ), 
2 => array(
    'F' => array(lots of objs), 
    'G' => array(lots and lots of objs) ) 

等等。

+0

不錯。問題是我需要以相同的順序項目。 – Zahymaka

+0

這很難。關閉我的頭頂上:你可以開始製作一系列的計數。 '$ counts = array_map(function($ x){return count($ x);},$ input);'然後'asort($ counts)'並使用'array_chunk()'拆分'$ counts'數組。然後,你必須通過'$ input'循環訪問,並使用'array_search()'來查看每個鍵所在的'$ counts'子集。繁瑣但不是不可能的。 – Jazz