Array vult niet (Opgelost)
ikki007 - 31/08/2007 23:31
PHP ver gevorderde
Hey,
Ik wil het getal 20 verdelen in 8 arrays.
<?php
$arr = array();
$arr[1] = '';
$arr[2] = '';
$arr[3] = '';
$arr[4] = '';
$arr[5] = '';
$arr[6] = '';
$arr[7] = '';
$arr[8] = '';
for($i = 20; $i < 1; $i--)
{
$rand1 = rand(1,8);
$rand2 = rand(1, $i);
if(empty($arr[$rand1]))
{
$arr[$rand1] = $rand2;
}
}
print_r($arr);
?>
<?php
$arr [ 1 ] = '' ;
$arr [ 2 ] = '' ;
$arr [ 3 ] = '' ;
$arr [ 4 ] = '' ;
$arr [ 5 ] = '' ;
$arr [ 6 ] = '' ;
$arr [ 7 ] = '' ;
$arr [ 8 ] = '' ;
for ( $i = 20 ; $i < 1 ; $i -- )
{
{
$arr [ $rand1 ] = $rand2 ;
}
}
?>
Alleen blijft $arr leeg..
Hoe kom dit?
14 antwoorden
Gesponsorde links
lemoinet - 31/08/2007 23:43
PHP gevorderde
$i > 1
avdg - 01/09/2007 10:31 (laatste wijziging 01/09/2007 13:05)
PHP gevorderde
$count_arr = 8;//aantal arrays te vullen
$som = 20; //het totaal aantal te vullen in de arrays
for ($i = 1; $i > $count_arr; $i++)//arrays vullen
{
$arr[$i] = 0;
}
for ($i = $som; $i <1; $i--)
{
$rand_arr = mt_rand(1, $count_arr);//Ik gebruik liever een andere generator :)
++$arr[$rand_arr];//Optellen met 1
}
$count_arr = 8 ; //aantal arrays te vullen
$som = 20 ; //het totaal aantal te vullen in de arrays
for ( $i = 1 ; $i > $count_arr ; $i ++ ) //arrays vullen
{
$arr [ $i ] = 0 ;
}
for ( $i = $som ; $i < 1 ; $i -- )
{
$rand_arr = mt_rand ( 1 , $count_arr ) ; //Ik gebruik liever een andere generator :) ++ $arr [ $rand_arr ] ; //Optellen met 1
}
kheb de code nu pas geschreven, bugs mogelijk!
Hopelijk dat het werkt
Rik - 01/09/2007 10:58 (laatste wijziging 01/09/2007 11:01)
Crew algemeen
@avdg
Jouw code werkt niet. $count_array bijvoorbeeld is niet gedefinieerd.
Ik heb zelf ook even wat in elkaar gezet:
function arrayFillRandom($count, $total, $min = null, $max = null) {
// Gemiddelde waarde van alle elementen
$average = $total / $count;
// Marge waarbinnen de waarden moeten liggen
$margin = $average / $count + 1;
// Minimale waarde
$min = is_integer($min) ? $min : floor($average - $margin);
// Maximale waarde
$max = is_integer($max) ? $max : ceil($average + $margin);
// Array vullen met nullen
$array = array_fill(0, $count, 0);
// Alle elementen afgaan
foreach ($array as $key => $value) {
// Nieuwe waarde genereren
$value = round(rand($min, $total <= $max ? $total : $max));
// Totaal nog te verdelen bijwerken
$total -= $value;
// Nieuwe waarde setten
$array[$key] = $value;
}
// Array nog een keer door elkaar husselen
shuffle($array);
// Resultaat returnen
return $array;
}
print_r(arrayFillRandom(8, 20));
function arrayFillRandom( $count , $total , $min = null , $max = null ) {
// Gemiddelde waarde van alle elementen
$average = $total / $count ;
// Marge waarbinnen de waarden moeten liggen
$margin = $average / $count + 1 ;
// Minimale waarde
// Maximale waarde
// Array vullen met nullen
// Alle elementen afgaan
foreach ( $array as $key => $value ) {
// Nieuwe waarde genereren
$value = round ( rand ( $min , $total <= $max ?
$total : $max ) ) ; // Totaal nog te verdelen bijwerken
$total -= $value ;
// Nieuwe waarde setten
$array [ $key ] = $value ;
}
// Array nog een keer door elkaar husselen
// Resultaat returnen
return $array ;
}
Edit:
Ik heb een nieuwe status: PHP expert!
Rik - 01/09/2007 11:55
Crew algemeen
Foutje...
Als je van regel 15 hetvolgende maakt doet ie het wel (nu wat beter getest ):
$value = $key == count($array) - 1 ? $total : round(rand($min, $total <= $max ? $total : $max));
$value = $key == count ( $array ) - 1 ?
$total : round ( rand ( $min , $total <= $max ?
$total : $max ) ) ;
avdg - 01/09/2007 13:01 (laatste wijziging 01/09/2007 13:49)
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
function arrayFillRandom($count_arr, $som){
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
*/
$array = array_fill(0, $count_arr, 0);
for ($i = 0; $i < $som; $i++)
{
$rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
$array[$rand_arr]++;//Optellen met 1
}
return $array;
}
print_r(arrayFillRandom(8, 20));
function arrayFillRandom( $count_arr , $som ) {
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
*/
for ( $i = 0 ; $i < $som ; $i ++ )
{
$rand_arr = mt_rand ( 0 , $count_arr - 1 ) ; //Willekeurig array bijvullen $array [ $rand_arr ] ++; //Optellen met 1
}
return $array ;
}
Mijn code is korter, maar heeft minder te bieden ( ?)
Ook klopt de som altijd.
avdg - 01/09/2007 14:14
PHP gevorderde
Srr, van die bugs, ik had het eigenlijk niet uitgetest
Rik - 01/09/2007 14:36 (laatste wijziging 18/11/2007 14:55)
Crew algemeen
Dit is hem dan geworden:
<?php
function arrayFillRandom($count, $total, $min = 0, $max = null) {
// Verkeerde volgorde min en max corrigeren
if (is_integer($min) && is_integer($max)) {
$tmp = min($min, $max);
$max = max($min, $max);
$min = $tmp;
}
// Minimale waarde afhandelen
if (($start = $min * $count) > $total) {
// Als min ongeldig is negeren we hem
$min = 0;
$start = 0;
}
// Maximale waarde afhandelen
if (is_integer($max) && $max * $count < $total) {
// Als max ongeldig is negeren we hem
$max = null;
}
// Array met beginwaarden vullen
$array = array_fill(0, $count, $min);
// Items vullen totdat het totaal is bereikt
for ($i = $start; $i < $total; $i++) {
// Random plaats in de array kiezen
$random = rand(0, $count - 1);
// Maximale waarden controleren
if (is_integer($max) && $array[$random] >= $max) {
$i--;
continue;
}
// Gekozen item ophogen
$array[$random]++;
}
// Resultaat returnen
return $array;
}
?>
<?php
function arrayFillRandom( $count , $total , $min = 0 , $max = null ) {
// Verkeerde volgorde min en max corrigeren
$min = $tmp ;
}
// Minimale waarde afhandelen
if ( ( $start = $min * $count ) > $total ) {
// Als min ongeldig is negeren we hem
$min = 0 ;
$start = 0 ;
}
// Maximale waarde afhandelen
// Als max ongeldig is negeren we hem
$max = null ;
}
// Array met beginwaarden vullen
// Items vullen totdat het totaal is bereikt
for ( $i = $start ; $i < $total ; $i ++ ) {
// Random plaats in de array kiezen
$random = rand ( 0 , $count - 1 ) ; // Maximale waarden controleren
if ( is_integer ( $max ) && $array [ $random ] >= $max ) { $i --;
continue ;
}
// Gekozen item ophogen
$array [ $random ] ++;
}
// Resultaat returnen
return $array ;
}
?>
Jouw algoritme was echt VEEL simpeler!
Edit:
Je hebt gelijk avgd, ik heb de bug eruit gehaald...
avdg - 01/09/2007 14:48 (laatste wijziging 18/11/2007 15:11)
PHP gevorderde
Mijn versie:
function arrayFillRand($count_arr, $som, $min = 0, $max = 0){
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
$min = min
$max = max
*/
if (($min * $count_arr) > $som) return false;//Controle voor te grote minimun
$array = array_fill(0, $count_arr, $min);//Vullen met minimun
$som -= $min * $count_arr;//Van de som aftrekken
for ($i = 0; $i < $som; $i++)//Vullen...
{
do {
$rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
if($max == 0) break;//Geen maximum controle
} while ($array[$rand_arr] + 1 > $max);//Te groot?
$array[$rand_arr]++;//Optellen met 1
}
return $array;
}
print_r(arrayFillRand(8, 20, 1, 4));
function arrayFillRand( $count_arr , $som , $min = 0 , $max = 0 ) {
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
$min = min
$max = max
*/
if ( ( $min * $count_arr ) > $som ) return false ; //Controle voor te grote minimun
$array = array_fill ( 0 , $count_arr , $min ) ; //Vullen met minimun $som -= $min * $count_arr ; //Van de som aftrekken
for ( $i = 0 ; $i < $som ; $i ++ ) //Vullen...
{
do {
$rand_arr = mt_rand ( 0 , $count_arr - 1 ) ; //Willekeurig array bijvullen if ( $max == 0 ) break ; //Geen maximum controle
} while ( $array [ $rand_arr ] + 1 > $max ) ; //Te groot?
$array [ $rand_arr ] ++; //Optellen met 1
}
return $array ;
}
print_r ( arrayFillRand
( 8 , 20 , 1 , 4 ) ) ;
Bij mij is wel de functienaam veranderd zodat ik ook mijn vorige nog had.
@boekefalos:
if (is_integer($min) && is_integer($max)) {
$min = min($min, $max);
$max = max($min, $max);
}
klopt dat het $min == $max indien $min groter is?
is intussen opgelost
ik werk intussen ook aan een iets betere functie...
Woet - 02/09/2007 08:28 (laatste wijziging 02/09/2007 08:29)
Nieuw lid
En mijn versie
<?php
function fillArray($max){
for($i = 0; $i <= $max; $i++){
$rand = rand(1,8);
do {
$array[$rand][$i] = $i;
} while(!in_array($i, $array[$rand]));
}
return $array;
}
echo '<pre>';
print_r(fillArray(20));
?>
<?php
function fillArray( $max ) {
for ( $i = 0 ; $i <= $max ; $i ++ ) {
do {
$array [ $rand ] [ $i ] = $i ;
}
return $array ;
}
?>
avdg - 18/11/2007 15:23 (laatste wijziging 18/11/2007 16:23)
PHP gevorderde
Mijn licht verbeterde functie:
<?php
function arrayFillRand($count_arr, $som, $Imin = 0, $Imax = 0){
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
$min = min
$max = max
*/
//Controle van vars...
if(!is_numeric($count_arr)||!is_numeric($som)) return false;
$min = is_numeric($Imin) ? $Imin : 0;
$max = is_numeric($Imax) ? $Imax : 0;
$min = $Imin > $Imax ? $Imax : $Imin;
$max = $Imin < $Imax ? $Imax : $Imin;
//Uitwerken...
$array = array_fill(0, $count_arr, $min);//Vullen met minimun
$som -= $min * $count_arr;//Van de som aftrekken
$max = $max * $count_arr > $som ? 0 : $max;//Negatief gaat niet... ook nul niet
for ($i = 0; $i < $som; $i++)//Vullen...
{
$rand_arr = mt_rand(0, $count_arr - 1);//Willekeurig array bijvullen
do {
$rand_arr = $rand_arr + 2 > $count_arr ? 0 : ++$rand_arr;
} while ($array[$rand_arr] + 1 > $max && $max != 0);//Te groot?
$array[$rand_arr]++;//Optellen met 1
}
return $array;
}
print_r(arrayFillRand(8, 20, 1, 1));
?>
<?php
function arrayFillRand( $count_arr , $som , $Imin = 0 , $Imax = 0 ) {
/*
$count_arr = aantal arrays te vullen
$som = het totaal aantal te vullen in de arrays
$min = min
$max = max
*/
//Controle van vars...
$min = $Imin > $Imax ? $Imax : $Imin ;
$max = $Imin < $Imax ? $Imax : $Imin ;
//Uitwerken...
$array = array_fill ( 0 , $count_arr , $min ) ; //Vullen met minimun $som -= $min * $count_arr ; //Van de som aftrekken
$max = $max * $count_arr > $som ? 0 : $max ; //Negatief gaat niet... ook nul niet
for ( $i = 0 ; $i < $som ; $i ++ ) //Vullen...
{
$rand_arr = mt_rand ( 0 , $count_arr - 1 ) ; //Willekeurig array bijvullen do {
$rand_arr = $rand_arr + 2 > $count_arr ? 0 : ++ $rand_arr ;
} while ( $array [ $rand_arr ] + 1 > $max && $max != 0 ) ; //Te groot?
$array [ $rand_arr ] ++; //Optellen met 1
}
return $array ;
}
print_r ( arrayFillRand
( 8 , 20 , 1 , 1 ) ) ; ?>
Gesponsorde links
Dit onderwerp is gesloten .