2010-11-18 11 views
4
$a = array(8, 16, 16, 32, 8, 8, 4, 4); 

Avec un tableau comme celui ci-dessus, il y a un moyen de diviser/diviser le tableau en fonction de la valeur jusqu'à une valeur définie. Par exemple si je voulais qu'ils soient égaux à 32. Mon tableau final aura jusqu'à 100 valeurs toutes étant soit 32, 16, 8 ou 4 et j'ai juste besoin de grouper les éléments pour que la valeur soit toujours égale à une valeur définie.Diviser/diviser en fonction de la valeur

à partir du tableau ci-dessus, j'espère obtenir:

$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 

comme $ [0] résume jusqu'à 32 et ainsi fait un $ [1] et $ [2].

+2

pourquoi voudriez-vous obtenir '[[16,16], [32], [8,8,8,4 , 4]] 'et non, à titre d'exemple,' [[32], [8,8,16], [4,4,8,16]] '? Ou n'est-ce pas important? –

+0

ow, peu importe ce que les groupes sont constitués tant qu'ils totalisent 32 désolé pour la confusion. – azzy81

+0

Appuyé - est-ce important de savoir comment ils sont combinés tant qu'il totalise 32? Aussi que faire si le total n'est pas un multiple de 32? – Spudley

Répondre

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); 

Cela fonctionnera, mais seulement parce que dans votre cas, vous avez 4 | 8 | 16 | 32, et seulement si la somme nécessaire est un multiple du plus grand nombre (32).

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

Note: | signifie divides.

+0

'|' est un opérateur bitwise signifiant 'OR', pourquoi n'avez-vous pas fait' 4/8/16/32'? – RobertPitt

+0

@Robert Je faisais référence au '|' utilisé dans Math. Désolé si cela a créé une confusion. En utilisant ce chaînage, j'ai essayé de faire remarquer que chaque chiffre divise le suivant. '4/8/16/32' est juste égal à' O' il ne vous dit rien de plus. –

+0

Aucun problème, beaucoup de membres se confondent avec les opérateurs Bitwise, y compris moi-même à certains moments, juste pour s'assurer qu'il n'y a pas de confusion, un grand bloc de code aussi :) +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; 
} 

testé avec votre entrée:

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