2013-08-05 89 views
1

這個問題是關於這個帖子 How to distribute mysql result set in an multidimensional array of 4 arrays填充4陣列分佈均勻,儘可能從上到下

我被接受的答案,但現在我想做出改變的代碼,我沒有很多的成功...

基本上,從一個MySQL的結果集,我需要填充4個數組儘可能從上到下均勻分佈... 克里斯海耶斯提供了一個solutuon的工作,但當我今天測試它時,我意識到它將數組從左到右,而不是從上到下......

我如何更改代碼,使其儘可能地從上到下填充4個數組?

$i = 0; 
$array_r = array(array(), array(), array(), array()); 

while ($stmt->fetch()) { 
    array_push($array_r[$i], array(... values ...)); 
    $i = ($i + 1) % 4; 
} 
+0

如何的長度不*從左到右*和*從上到下*涉及數組? – Yoshi

+0

看看[array_chunk](http://www.php.net/array-chunk) – Orangepill

+0

@Yoshi:代碼從左到右填充數組...換句話說,第二個值將在第二個數組中不是第一個數組的第二個值 – Marco

回答

3

最終版本,而在所有的操作輸入數組:

for ($num = count($input), $offset = 0; $numBuckets > 0; $numBuckets -= 1, $num -= $bucketSize, $offset += $bucketSize) { 
    $bucketSize = ceil($num/$numBuckets); 
    $output[] = array_slice($input, $offset, $bucketSize); 
} 

透水答案

嘗試以下操作:

<?php 
$input = range('A', 'Z'); // test input data 
$output = array();  // the output container 
$numBuckets = 4;   // number of buckets to fill 

for (; $numBuckets > 0; $numBuckets -= 1) { 
    $output[] = array_splice($input, 0, ceil(count($input)/$numBuckets)); 
} 

print_r($output); 

替代版本,而不恆定複查陣列

for ($num = count($input); $numBuckets > 0; $numBuckets -= 1, $num -= $bucketSize) { 
    $bucketSize = ceil($num/$numBuckets); 
    $output[] = array_splice($input, 0, $bucketSize); 
} 
+0

測試和完美的作品......我甚至把一個計時器來測試速度和它的快速... – Marco

+0

@Marco歡迎您!;) – Yoshi

+1

@Marco正如你提到的速度,我添加了一個替代版本,它刪除輸入數組上的恆定長度檢查。 – Yoshi

1

該段應爲你工作:

<?php 
$array= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]; 

$strays = count($array)%4; 
$offset = 0; 
$results = array(); 

for($x = 0; $x < 4; $x++){ 
    if ($x < $strays){ 
     $size = (floor(count($array)/4) + 1); 
    } else { 
     $size = (floor(count($array)/4)); 
    } 
    $results[] = array_slice($array, $offset, $size); 
    $offset+=$size; 

} 
print_r($results); 
+0

array_chunk在這種情況下不起作用coz 4個數組需要儘可能從上到下均勻分佈...如果我有18行的結果集,array_chunk用5行填充第一個數組,第二個數組與5行,第5個數組的第3個數組和第3個數組的第3個數組......它需要是5,5,4,4 – Marco

+0

@Marco我明白你現在在做什麼。 – Orangepill

+0

任何想法如何讓這個工作?謝謝 – Marco

0

我測試過的東西,它似乎工作...但它看起來很麪條......請隨時優化代碼。謝謝。

$num_rows = $stmt->num_rows; //number of records returned by the result set 
$min_per_column = (int)($num_rows/4); //minimum records per column 
$remainder = $num_rows % 4; //the remainder 

$array_r = array(array(), array(), array(), array()); 
$i = 1; 
$col = 0; 

//how many records to populate before moving to the next array? 
$rows = ($col < $remainder) ? $min_per_column + 1 : $min_per_column; 

while ($stmt->fetch()) { 
    array_push($array_r[$col], array($r_recordingid, $r_title, $r_subtitle, $r_seourl)); 
    $i++; 

    //initialize values for new array 
    if ($i > $rows) { 
     $i = 1; 
     $col++; 
     $rows = ($col < $remainder) ? $min_per_column + 1 : $min_per_column; 
    } 
}