2010-11-18 11 views
4

Mit einem Array wie dem oben genannten gibt es einen Weg, so dass ich das Array basierend auf dem Wert bis zu einem festgelegten Wert teilen/teilen kann. zB wenn ich möchte, dass sie 32 ergeben. Mein letztes Array wird bis zu 100 Werte haben, alle entweder 32, 16, 8 oder 4 und ich muss die Items nur so gruppieren, dass der Wert immer einem festgelegten Betrag entspricht, also in diesem Beispiel 32.Array dividieren/teilen nach Wert

Aus der obigen Anordnung würde ich hoffen würde zu bekommen:

$a[0][1] = 16 
$a[0][2] = 16 

$a[1][3] = 32 

$a[2][0] = 8 
$a[2][4] = 8 
$a[2][5] = 8 
$a[2][6] = 4 
$a[2][7] = 4 

wie $ a [0] fasst bis zu 32 und so auch ein $ [1] und einen $ [2].

+2

warum würden Sie bekommen '[[16,16], [32], [8,8,8,4 , 4]] und nicht als Beispiel "[[32], [8,8,16], [4,4,8,16]]"? Oder spielt es keine Rolle? –

+0

Es spielt keine Rolle, woraus die Gruppen bestehen, solange sie sich für die Verwirrung entschuldigen. – azzy81

+0

abgeordnet - ist es wichtig, wie sie kombiniert werden, solange es insgesamt 32? Auch was zu tun, wenn die Summe nicht ein Vielfaches von 32 ist? – Spudley

Antwort

4
$a = array(8, 16, 16, 32, 8, 8, 4, 4); 
$limit = 32; 
rsort($a); 
$b = array(array()); 
$index = 0; 
foreach($a as $i){ 
    if($i+array_sum($b[$index]) > $limit){ 
     $b[++$index] = array(); 
    } 
    $b[$index][] = $i; 
} 
$a = $b; 
print_r($a); 

Es wird funktionieren, aber nur, weil in Ihrem Fall haben Sie 4 | 8 | 16 | 32, und nur wenn die benötigte Summe ein Vielfaches der größten Zahl ist (32).

Test: http://codepad.org/5j5nl3dT

Hinweis: | bedeutet divides.

+0

'|' ist ein bitweiser Operator, der 'ODER' bedeutet, warum hast du gerade nicht' 4/8/16/32' gemacht? – RobertPitt

+0

@Robert Ich bezog mich auf das '|' in Mathe verwendet. Es tut uns leid, wenn es zu Verwirrung kam. Mit dieser Verkettung habe ich versucht, darauf hinzuweisen, dass jede Zahl die nächste teilt. '4/8/16/32' ist gleich" O "und sagt dir nichts mehr. –

+0

Keine Probleme, viele Mitglieder werden verwirrt mit Bitwise Operatoren einschließlich mich manchmal, nur um sicherzustellen, dass es keine Verwirrung, großen Block von Code aswell :) +1 – RobertPitt

0
function split_into_thirtytwos($input_array) { 
    $output_array=array(); 
    $work_array=array(); 
    $sum=0; 
    sort($input_array,SORT_NUMERIC); 
    while(count($input_array)>0) { 
    $sum=array_sum($work_array)+$input_array[count($input_array)-1]; 
    if($sum<=32) { 
     $work_array[]=array_pop($input_array); 
    } else { 
     $output_array[]=$work_array; 
     $work_array=array(); 
    } 
    } 
    if(count($work_array)>0) {$output_array[]=$work_array;} 
    return $output_array; 
} 

mit Ihrem Eingang Getestet:

Array 
(
    [0] => Array 
    (
     [0] => 32 
    ) 

    [1] => Array 
    (
     [0] => 16 
     [1] => 16 
    ) 

    [2] => Array 
    (
     [0] => 8 
     [1] => 8 
     [2] => 8 
     [3] => 4 
     [4] => 4 
    ) 

) 
0
$a = array(8, 16, 16, 32, 8, 8, 4, 4); 
$group_limit = 32; 


$current_group = $result = array(); 
$cycles_since_successful_operation = 0; 

while ($a && $cycles_since_successful_operation < count($a)) 
{ 
    array_push($current_group,array_shift($a)); 

    if (array_sum($current_group) > $group_limit) 
     array_push($a,array_pop($current_group)); 
    elseif (array_sum($current_group) < $group_limit) 
     $cycles_since_successful_operation = 0; 
    elseif (array_sum($current_group) == $group_limit) 
    { 
     $result []= $current_group; 
     $current_group = array(); 
     $cycles_since_successful_operation = 0; 
    } 
} 
if ($a) 
    $result []= $a; // Remaining elements form the last group 

http://codepad.org/59wmsi4g

Verwandte Themen