login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Array vult niet (Opgelost)

Offline ikki007 - 31/08/2007 23:31
Avatar van ikki007Gouden medailleGouden medaille

PHP ver gevorderde
Hey,

Ik wil het getal 20 verdelen in 8 arrays.

  1. <?php
  2.  
  3. $arr = array();
  4. $arr[1] = '';
  5. $arr[2] = '';
  6. $arr[3] = '';
  7. $arr[4] = '';
  8. $arr[5] = '';
  9. $arr[6] = '';
  10. $arr[7] = '';
  11. $arr[8] = '';
  12.  
  13. for($i = 20; $i < 1; $i--)
  14. {
  15. $rand1 = rand(1,8);
  16. $rand2 = rand(1, $i);
  17.  
  18. if(empty($arr[$rand1]))
  19. {
  20. $arr[$rand1] = $rand2;
  21. }
  22. }
  23.  
  24. print_r($arr);
  25. ?>


Alleen blijft $arr leeg..
Hoe kom dit?

14 antwoorden

Gesponsorde links
Offline lemoinet - 31/08/2007 23:43
Avatar van lemoinet PHP gevorderde $i > 1
Offline ikki007 - 31/08/2007 23:47
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Hmm bedankt, maar kom er nu net achter dat het zo niet gaat lukken.

Hoe kan ik array 1 t/m 8 willekeurig laten vullen en dat het samen 20 is?
Offline avdg - 01/09/2007 10:31 (laatste wijziging 01/09/2007 13:05)
Avatar van avdg PHP gevorderde
  1. $count_arr = 8;//aantal arrays te vullen
  2. $som = 20; //het totaal aantal te vullen in de arrays
  3. for ($i = 1; $i > $count_arr; $i++)//arrays vullen
  4. {
  5. $arr[$i] = 0;
  6. }
  7. for ($i = $som; $i <1; $i--)
  8. {
  9. $rand_arr = mt_rand(1, $count_arr);//Ik gebruik liever een andere generator :)
  10. ++$arr[$rand_arr];//Optellen met 1
  11. }

kheb de code nu pas geschreven, bugs mogelijk!

Hopelijk dat het werkt   
Offline Rik - 01/09/2007 10:58 (laatste wijziging 01/09/2007 11:01)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
@avdg
Jouw code werkt niet. $count_array bijvoorbeeld is niet gedefinieerd.

Ik heb zelf ook even wat in elkaar gezet:
  1. function arrayFillRandom($count, $total, $min = null, $max = null) {
  2. // Gemiddelde waarde van alle elementen
  3. $average = $total / $count;
  4. // Marge waarbinnen de waarden moeten liggen
  5. $margin = $average / $count + 1;
  6. // Minimale waarde
  7. $min = is_integer($min) ? $min : floor($average - $margin);
  8. // Maximale waarde
  9. $max = is_integer($max) ? $max : ceil($average + $margin);
  10. // Array vullen met nullen
  11. $array = array_fill(0, $count, 0);
  12. // Alle elementen afgaan
  13. foreach ($array as $key => $value) {
  14. // Nieuwe waarde genereren
  15. $value = round(rand($min, $total <= $max ? $total : $max));
  16. // Totaal nog te verdelen bijwerken
  17. $total -= $value;
  18. // Nieuwe waarde setten
  19. $array[$key] = $value;
  20. }
  21. // Array nog een keer door elkaar husselen
  22. shuffle($array);
  23. // Resultaat returnen
  24. return $array;
  25. }
  26. print_r(arrayFillRandom(8, 20));


Edit:
Ik heb een nieuwe status: PHP expert!  
Offline ikki007 - 01/09/2007 11:50
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Goedemorgen,

Gefeliciteerd Boukefalos!!  

Alleen ik denk dat je 1 ding over het hoofd hebt gezien.
Alle arrays weer bij elkaar opgeteld moeten 20 zijn. (de values dus)

Bij jou komt er de ene keer 19 uit en de andere keer 17 etc, terwijl ik 20 als 2de paramater heb opgegeven.  
Offline Rik - 01/09/2007 11:55
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Foutje...  

Als je van regel 15 hetvolgende maakt doet ie het wel (nu wat beter getest  ):
  1. $value = $key == count($array) - 1 ? $total : round(rand($min, $total <= $max ? $total : $max));
Offline ikki007 - 01/09/2007 12:01
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Haha, had zoiets ook zelf even kunnen oplossen maar ben net wakker en had nog veel te doen dus maar even de snelle weg gekozen  

Echt super bedankt boukefalos  
Offline avdg - 01/09/2007 13:01 (laatste wijziging 01/09/2007 13:49)
Avatar van avdg PHP gevorderde bedankt boukefalos voor het debuggen.

Edit: Humm.... ik wist niet dat er zo handige functies waren voor arrays...

Mijn code zou dan zoiets moeten worden
  1. function arrayFillRandom($count_arr, $som){
  2. /*
  3.   $count_arr = aantal arrays te vullen
  4.   $som = het totaal aantal te vullen in de arrays
  5.   */
  6. $array = array_fill(0, $count_arr, 0);
  7. for ($i = 0; $i < $som; $i++)
  8. {
  9. $rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
  10. $array[$rand_arr]++;//Optellen met 1
  11. }
  12. return $array;
  13. }
  14. print_r(arrayFillRandom(8, 20));

Mijn code is korter, maar heeft minder te bieden ( ?)
Ook klopt de som altijd.
Offline Rik - 01/09/2007 14:07
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Nu ik jouw code nog eens bekijk zie ik dat die toch eigenlijk een stuk makkelijker dan die van mij is.  

Ik ga die van jou eens ombouwen zodat je ook minimale en maximale waardes op kan geven!
Offline avdg - 01/09/2007 14:14
Avatar van avdg PHP gevorderde Srr, van die bugs, ik had het eigenlijk niet uitgetest
Offline Rik - 01/09/2007 14:36 (laatste wijziging 18/11/2007 14:55)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Dit is hem dan geworden:
  1. <?php
  2. function arrayFillRandom($count, $total, $min = 0, $max = null) {
  3. // Verkeerde volgorde min en max corrigeren
  4. if (is_integer($min) && is_integer($max)) {
  5. $tmp = min($min, $max);
  6. $max = max($min, $max);
  7. $min = $tmp;
  8. }
  9. // Minimale waarde afhandelen
  10. if (($start = $min * $count) > $total) {
  11. // Als min ongeldig is negeren we hem
  12. $min = 0;
  13. $start = 0;
  14. }
  15. // Maximale waarde afhandelen
  16. if (is_integer($max) && $max * $count < $total) {
  17. // Als max ongeldig is negeren we hem
  18. $max = null;
  19. }
  20. // Array met beginwaarden vullen
  21. $array = array_fill(0, $count, $min);
  22. // Items vullen totdat het totaal is bereikt
  23. for ($i = $start; $i < $total; $i++) {
  24. // Random plaats in de array kiezen
  25. $random = rand(0, $count - 1);
  26. // Maximale waarden controleren
  27. if (is_integer($max) && $array[$random] >= $max) {
  28. $i--;
  29. continue;
  30. }
  31. // Gekozen item ophogen
  32. $array[$random]++;
  33. }
  34. // Resultaat returnen
  35. return $array;
  36. }
  37. ?>
Jouw algoritme was echt VEEL simpeler!  

Edit:
Je hebt gelijk avgd, ik heb de bug eruit gehaald... 
Offline avdg - 01/09/2007 14:48 (laatste wijziging 18/11/2007 15:11)
Avatar van avdg PHP gevorderde Mijn versie:
  1. function arrayFillRand($count_arr, $som, $min = 0, $max = 0){
  2. /*
  3.   $count_arr = aantal arrays te vullen
  4.   $som = het totaal aantal te vullen in de arrays
  5.   $min = min
  6.   $max = max
  7.   */
  8. if (($min * $count_arr) > $som) return false;//Controle voor te grote minimun
  9. $array = array_fill(0, $count_arr, $min);//Vullen met minimun
  10. $som -= $min * $count_arr;//Van de som aftrekken
  11. for ($i = 0; $i < $som; $i++)//Vullen...
  12. {
  13. do {
  14. $rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
  15. if($max == 0) break;//Geen maximum controle
  16. } while ($array[$rand_arr] + 1 > $max);//Te groot?
  17. $array[$rand_arr]++;//Optellen met 1
  18. }
  19. return $array;
  20. }
  21. print_r(arrayFillRand(8, 20, 1, 4));

Bij mij is wel de functienaam veranderd zodat ik ook mijn vorige nog had.

@boekefalos:
  1. if (is_integer($min) && is_integer($max)) {
  2. $min = min($min, $max);
  3. $max = max($min, $max);
  4. }

klopt dat het $min == $max indien $min groter is? 

is intussen opgelost   

ik werk intussen ook aan een iets betere functie...  
Offline Woet - 02/09/2007 08:28 (laatste wijziging 02/09/2007 08:29)
Avatar van Woet Nieuw lid En mijn versie 

  1. <?php
  2. function fillArray($max){
  3. for($i = 0; $i <= $max; $i++){
  4. $rand = rand(1,8);
  5.  
  6. do {
  7. $array[$rand][$i] = $i;
  8. } while(!in_array($i, $array[$rand]));
  9. }
  10.  
  11. return $array;
  12. }
  13.  
  14. echo '<pre>';
  15. print_r(fillArray(20));
  16. ?>
Offline avdg - 18/11/2007 15:23 (laatste wijziging 18/11/2007 16:23)
Avatar van avdg PHP gevorderde Mijn licht verbeterde functie:
  1. <?php
  2. function arrayFillRand($count_arr, $som, $Imin = 0, $Imax = 0){
  3. /*
  4.   $count_arr = aantal arrays te vullen
  5.   $som = het totaal aantal te vullen in de arrays
  6.   $min = min
  7.   $max = max
  8.   */
  9. //Controle van vars...
  10. if(!is_numeric($count_arr)||!is_numeric($som)) return false;
  11. $min = is_numeric($Imin) ? $Imin : 0;
  12. $max = is_numeric($Imax) ? $Imax : 0;
  13. $min = $Imin > $Imax ? $Imax : $Imin;
  14. $max = $Imin < $Imax ? $Imax : $Imin;
  15. //Uitwerken...
  16. $array = array_fill(0, $count_arr, $min);//Vullen met minimun
  17. $som -= $min * $count_arr;//Van de som aftrekken
  18. $max = $max * $count_arr > $som ? 0 : $max;//Negatief gaat niet... ook nul niet
  19. for ($i = 0; $i < $som; $i++)//Vullen...
  20. {
  21. $rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
  22. do {
  23. $rand_arr = $rand_arr + 2 > $count_arr ? 0 : ++$rand_arr;
  24. } while ($array[$rand_arr] + 1 > $max && $max != 0);//Te groot?
  25. $array[$rand_arr]++;//Optellen met 1
  26. }
  27. return $array;
  28. }
  29. print_r(arrayFillRand(8, 20, 1, 1));
  30. ?>
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.256s