2011-01-04 8 views
1

Angenommen, ich habe eine FunktionFunktion zu glätten mehrere Arrays

evenOut($array, $limit){ 
    //returns exactly $limit items 
} 

und diese Daten

$animals = array(); 
$animals['barn'] = array_fill(0,20, 'b'); 
$animals['forest'] = array_fill(0,20, 'f'); 
$animals['house'] = array_fill(0,20, 'h'); 
$animals['mountain'] = array_fill(0,20, 'm'); 

Ich möchte maximal 10 Tiere zurück, jedoch sollten sie unter die gleichmäßig verteilt werden Orte, aus denen sie kommen. so, wenn ich tat
evenOut($animals,8); i 2 jedes evenOut($animals,2);('b','b','f','f','h','h','m','m',)
bekäme sollte ('b','f')

zurück, wenn ich diese Daten haben

$animals = array(); 
$animals['barn'] = array_fill(0,1, 'b'); 
$animals['forest'] = array_fill(0,3, 'f'); 
$animals['house'] = array_fill(0,8, 'h'); 
$animals['mountain'] = array_fill(0,1, 'm'); 

evenOut($animals,8); erwartete Ergebnis ('b','f','f','f','h','h','h','m',)
evenOut($animals,10); erwartete Ergebnis wäre würde be ('b','f','f','f','h','h','h','h','h','m',)

$animals = array(); 
$animals['barn'] = array_fill(0,0, 'b'); 
$animals['forest'] = array_fill(0,3, 'f'); 

evenOut($animals,10); erwartete Ergebnis würde ('f','f','f') sein

Ich bin nicht sicher, wie ich diesen Ansatz sollte, ich hoffe, ist es eine einfache Möglichkeit

Antwort

0

Meine eigene Lösung

function evenOut($array, $limit){ 
     $indexes = count($array)-1; 
     $leveled = array(); 
     $count=0; 
     for($c= 0; $c < $limit; $c++){ 
      for($i = 0; $i <= $indexes; $i++){ 
       if(isset($array[$i][$c])){ 
        if(!isset($leveled[$i])) 
         $leveled[$i] = array(); 
        $leveled[$i][]= $array[$i][$c]; 
        $count++; 

       } 
       if($count == $limit) 
        break 2; 
      } 
     } 
     $merged = array(); 
     foreach($leveled as $array) 
      $merged = array_merge($merged, $array); 
     return $merged; 
    } 
0
<?php 
function eventOut($animals, $limit) 
{ 
    $j = 0; 
    $returnAnimals = array(); 
    for($i=0; $j<$limit; ++$i) { 
     foreach ($animals as $animal) { 
      if (isset($animal[$i] && $j<$limit) { 
       array_push($returnAnimals, $animal[$i]); 
       ++$j; 
      } else { 
       $extra++; 
      } 
     } 
    } 
    return $returnAnimals; 
} 

oder:

function eventOut($animals, $limit) 
{ 
    $returnAnimals = array(); 
    $types = count($animals); 
    $extra = $limit % $types; 
    $numberOfAnimals = ($limit - $extra)/$types; 
    foreach ($animals as $animal) { 
     $i = 0; 
     while ($i < $numberOfAnimals) { 
      if (isset($animal[$i])) { 
       array_push($returnAnimals, $animal[$i]); 
      } 
      $i++; 
     } 
     if ($extra > 0) { 
      array_push($returnAnimals, $animal[$i+1]; 
      $extra--; 
     } 
    } 
    return $returnAnimals; 
} 

I Haben Sie keine Zeit, den Mist zu beseitigen, aber das wäre die Grundfunktion, die Sie benötigen würden?

+0

Die erste Antwort hat drei Probleme, undefined $ extra und die Tiere Mischen und unbegrenzte Ausführung, wenn die Tiere weniger sind als der Grenzwert. der zweite funktioniert auch nicht wie erwartet, aber danke für die Mühe! – Moak