Avatar billede exp Juniormester
21. oktober 2003 - 23:05 Der er 20 kommentarer og
1 løsning

Opret dynamisk farve-array

Hejsa alle,

står lige og mangler en funktion i php, der:

1. Laver et array med vilkårlige farver, for hvilke det gælder, at jeg via variabler kan indstille:
  1.a. antal farver i array'et
  1.b. om det skal være helt vilkårlige farver, eller om de skal ligge i en bestemt del af farvespektret, fx via red, blue, green, yellow etc, og så bevæger den sig et stykke over/under værdien. Må gerne være formateret sådan #xxxxxx

2. Det er ikke påkrævet at alle farver er forskellige, dvs. der må godt være gengangere, men randomfunktionen skal være effektiv nok til at der er forskelle.

3. Der skal være mulighed for at indsætte et billede istedet for en farve, disse filnavne lægges i et array af denne type:
$arr = "fil1.jpg, fil2.gif, fil3.png etc";
Disse skal skiftes ud med tilfældige entries i array'et nævnt under pkt. 1
Er $arr tom, skal der ikke ske noget i den henseende.

Kan i lave det så jeg selv kan indstille spredningen i farverne, ryger der 50 point ekstra oveni.
Avatar billede skovenborg Nybegynder
22. oktober 2003 - 00:24 #1
er det noget i den her stil (den og godt nok ikke med spredning):
<?php
$antal = 10;
$spectre = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
function makeArr()
{
        global $spectre,$antal;
        for ($i=0;$i<$antal;$i++)
    {
        $farvearr[$i] = "#";
        for ($j=0;$j<6;$j++)
        {
            $farvearr[$i] .= $spectre[rand(0,sizeof($spectre))-1];
                }
        }
        return $farvearr;
}
function addBld($bld,$arr)
{
        if (sizeof($arr) != 0) $ent = rand(0,sizeof($arr)-1);
        $arr[$ent] = $bld;
        return $arr;
}
$arr = makeArr();
$arr = addBld("billede1.png",$arr);
print_r($arr);

?>
Avatar billede skovenborg Nybegynder
22. oktober 2003 - 00:26 #2
undskyld ændr lige det her:
for ($j=0;$j<6;$j++)
{
$farvearr[$i] .= $spectre[rand(0,sizeof($spectre)-1)];
}
Avatar billede detox Nybegynder
22. oktober 2003 - 02:55 #3
Jeg har brygget noget sammen, der laver et array ($my_color[]) med en spredning af farverne, efter nogen valgte parametre. Men jeg er i tvivl om, hvad du mener med punkt 3.

<?
// FUNKTIONER
function make_seed() {
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((double) $usec * 100000);
}
function rand_hex($start,$slut) {
  mt_srand(make_seed());
  $randval = mt_rand($start,$slut);
  return sprintf("%02X",$randval);
}
function random_color($rst=0,$rsl=255,$gst=0,$gsl=255,$bst=0,$bsl=255){
  return "#".rand_hex($rst,$rsl).rand_hex($gst,$gsl).rand_hex($bst,$bsl);
}
function color_range($col,$spr){
    $range = round(255/200*$spr);
    $scol = round(255/100*$col);
    $c[0] = $scol-$range;
    $c[1] = $scol+$range;
    if ($c[0]<0) {
        $c[1] = + abs($c[0]);
        $c[0] = 0;
    }
    elseif ($c[1]>255) {
        $c[0] -= $c[1]-255;
        $c[1] = 255;
    }
    return $c;
}
//SLUT FUNKTIONER

if (isset($_POST['submit'])) {
    extract($_POST);
    for ($i=0;$i<$antal;$i++) {
        $r = color_range($red,$spred);
        $g = color_range($green,$spred);
        $b = color_range($blue,$spred);
        $my_color[$i] = random_color($r[0],$r[1],$g[0],$g[1],$b[0],$b[1]);
        echo "<span style=\"color: ".$my_color[$i].";\">".$my_color[$i]."</span><br />";
    }
} else {
    $opt_str = "";
    for ($i=0;$i<=100;$i=$i+10) {
        $opt_str .= "<option value=\"".$i."\">".$i."</option>";
    }
?>
    <table>
    <form action="" method="post">
    <tr><td>Red:</td><td>
    <select name="red">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Green:</td><td>
    <select name="green">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Blue:</td><td>
    <select name="blue">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Spredning:</td><td>
    <select name="spred">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Antal farver:</td><td><input name="antal" type="text" size="4" maxlength="4" /></td></tr>
    <tr><td></td><td><input name="submit" type="submit" value="OK" /></td></tr>
    </form>
    </table>
<?
}
?>
Avatar billede exp Juniormester
22. oktober 2003 - 08:44 #4
http://firewerx.dk/exp/arr1.php <== Synes ikke rigtig jeg fanger så forfærdelig meget output :-)
(http://firewerx.dk/exp/arr1.phps)

http://firewerx.dk/exp/arr2.php <== Så vidt jeg kan se burde
echo "<span style=\"color: ".$my_color[$i].";\">".$my_color[$i]."</span><br />";
udskrive en række farver, men det gør den vist bare ikke :-(
(http://firewerx.dk/exp/arr2.phps)
Avatar billede exp Juniormester
22. oktober 2003 - 08:52 #5
Pkt. 3 kan illustreres nogenlunde således:

$f_arr = array("#000000", "#0000ff", "#00ff00", "#ff0000", "#ffffff"); <== tilfældigt antal

så har jeg følgende billedarray:

$b_arr = array("fil.jpg", "fil2.jpg"); <== tilfældigt antal, der kan også sagtens være flere end der er farver

Idéen er så, at $b_arr skal mixes ind i $f_arr, således at filerne i $b_arr overtager tilfældige pladser i $f_arr

$e_arr = array("#000000", "fil2.jpg", "#00ff00", "#ff0000", "fil.jpg")


Kan i lave det, så jeg også kan bestemme hvor mange af billederne der skal tages fra $b_arr så vil det være RIGTIG fedt!

fx så ovenstående eksempel, med en variabel sat til 1, lave noget a la

$e_arr = array("#000000", "fil2.jpg", "#00ff00", "#ff0000", "#ffffff")
Avatar billede detox Nybegynder
22. oktober 2003 - 11:23 #6
Den fungerer da, helt efter hensigten. Du vælger en startværdi for de tre farver og en for spredningen (alle i procent), samt antal farver.
Kan tjekkes her:
http://www.buksevand.dk/test/farver.php

Farverne ligger så i array'et: $my_color[] og jeg har for eksemplets skyld printet dem ud.
Jeg får ikke tid til at se på pkt. 3 lige nu, men det burde være rimeligt at gå til med fx: array_splice() og shuffle()
Avatar billede exp Juniormester
22. oktober 2003 - 11:40 #8
Ved ikke lige hvorfor den ikke ville give mig noget output imorges, men nu virker det ja :-)
Avatar billede detox Nybegynder
22. oktober 2003 - 11:41 #9
Hmm, jeg har altså ikke ændret noget ;o)
Avatar billede exp Juniormester
22. oktober 2003 - 11:48 #10
hehe... og det virker også på mit eget link... men imorges lavede den ikke noget output - meget mystisk...
Avatar billede exp Juniormester
22. oktober 2003 - 23:13 #11
Nu har jeg kæmpet mig frem til dette:
<?php
    include('functions.php');
   
//    $n_arr = array("#000000", "#0000ff", "#00ff00", "#ff0000", "#ffffff");
    $n_arr = $my_color;
    $b_arr = array("fil.jpg", "fil2.jpg");
    unset($taken_arr);
   
    function insert_into_array($array,$ky,$val) {
        $n = $ky;
        foreach($array as $key => $value) {
            $backup_array[$key] = $array[$key];
        }
        $upper_limit = count($array);
        while($n <= $upper_limit) {
            if($n == $ky) {
                $array[$n] = $val;
                //echo "<br>".$n;
                echo "<br />";
            } else {
                $i = $n - "1";
                $array[$n] = $backup_array[$i];
            }
            $n++;
        }
        return $array;
    }
   
    for ($i=0;$i<count($b_arr);$i++) {
        $numbers = range(0,count($n_arr)-1);
        srand((float)microtime()*1000000);
        shuffle($numbers);
        echo "[".$numbers[0]."] => ";
        $key = $numbers[0];       
        echo $b_arr[$i];
        $value = $b_arr[$i];
       
        $new = insert_into_array($n_arr,$key, $value);
        $taken_arr[] = $key;
    }
       
    echo "<br /><br />".chr(36)."n_arr:<br />";
    print_r($new);
    echo "<br /><br />".chr(36)."taken_arr:<br />";
    print_r($taken_arr);
?>

functions.php indeholder detox's script (se ovenstående).

Problemet er, at den kun skifter den sidste fil ud, dvs. "fil.jpg" bliver ikke inkluderet.

Et andet problem er at sådan som scriptet er nu, så kan "fil2.jpg" godt komme til at overskrive den $key "fil.jpg" står på. Kan man indbygge en funktion der gør, at hvis en $key har været "udtrukket", så kan den ikke vælges igen.
De "udtrukne" $key's ligger i arrayet $taken_arr

Se eksempel på www.firewerx.dk/wish/arr.php
Avatar billede detox Nybegynder
23. oktober 2003 - 01:06 #12
Jeg har forsøgt på den her måde, det ser ud til at fungere, men jeg er ikke sikker på, hvad du mener med at de udtrukne $key's ikke må kunne vælges igen. Men hvis du vil genbruge array'et uden de udtrukne filnavne, så skal det vel gemmes på en eller anden facon.

<?
// FUNKTIONER
function make_seed() {
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((double) $usec * 100000);
}
function rand_hex($start,$slut) {
  mt_srand(make_seed());
  $randval = mt_rand($start,$slut);
  return sprintf("%02X",$randval);
}
function random_color($rst=0,$rsl=255,$gst=0,$gsl=255,$bst=0,$bsl=255){
  return "#".rand_hex($rst,$rsl).rand_hex($gst,$gsl).rand_hex($bst,$bsl);
}
function color_range($col,$spr){
    $range = round(255/200*$spr);
    $scol = round(255/100*$col);
    $c[0] = $scol-$range;
    $c[1] = $scol+$range;
    if ($c[0]<0) {
        $c[1] = + abs($c[0]);
        $c[0] = 0;
    }
    elseif ($c[1]>255) {
        $c[0] -= $c[1]-255;
        $c[1] = 255;
    }
    return $c;
}
//SLUT FUNKTIONER

$b_arr = array("fil.jpg", "fil2.jpg");

if (isset($_POST['submit'])) {
    extract($_POST);
    for ($i=0;$i<$antal;$i++) {
        $r = color_range($red,$spred);
        $g = color_range($green,$spred);
        $b = color_range($blue,$spred);
        $my_color[$i] = random_color($r[0],$r[1],$g[0],$g[1],$b[0],$b[1]);
    }
    $rep_array = count($b_arr)>=$filer ? array_slice($b_arr, 0, $filer) : $b_arr;
    array_splice($my_color, count($my_color)-count($rep_array), count($my_color), $rep_array);
    shuffle($my_color);
    foreach ($my_color as $item) {
        echo $item."<br />";
    }
} else {
    $opt_str = "";
    for ($i=0;$i<=100;$i=$i+10) {
        $opt_str .= "<option value=\"".$i."\">".$i."</option>";
    }
?>
    <table>
    <form action="" method="post">
    <tr><td>Red:</td><td>
    <select name="red">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Green:</td><td>
    <select name="green">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Blue:</td><td>
    <select name="blue">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Spredning:</td><td>
    <select name="spred">
    <?=$opt_str?>
    </select></td></tr>
    <tr><td>Antal farver:</td><td><input name="antal" type="text" size="4" maxlength="4" /></td></tr>
    <tr><td>Antal filer:</td><td><input name="filer" type="text" size="4" maxlength="4" /></td></tr>
    <tr><td></td><td><input name="submit" type="submit" value="OK" /></td></tr>
    </form>
    </table>
<?
}
?>
Avatar billede exp Juniormester
23. oktober 2003 - 08:24 #13
Det jeg mener er, at hvis vi har følgende array:

array("1", "2", "3", "4", "5")

og fil-array:

array("fil.jpg", "fil2.jpg")

og så vi kører scriptet. Så får vi fx efter første gennemkørsel følgende array:

array("1", "fil.jpg", "3", "4", "5")

Så skal det være sådan, at den $key der nu indeholder "fil.jpg" ($key[2]) er "låst, dvs at "fil2.jpg" kan IKKE overskrive "fil.jpg"
Avatar billede detox Nybegynder
23. oktober 2003 - 10:40 #14
Jeg forstår bare ikke, at du har brug for flere gennemkørsler, men nu kan jeg heller ikke helt gennemskue, hvad du skal bruge det til.
Avatar billede exp Juniormester
23. oktober 2003 - 10:47 #15
Det jeg skal bruge det til er dette:
http://firewerx.dk/wish/

Men din kommentar 23/10-2003 01:06:01 gav mig vist nogenlunde det jeg søgte. Sidder lige og retter det til, og når det virker tilfredsstillende, så får du dine velfortjente point :-)
Avatar billede detox Nybegynder
23. oktober 2003 - 11:07 #16
Ok, ja. Det ser faktisk meget godt ud. Så kan jeg godt se du ikke har brug for formen. Som jeg har lavet det, kan du frit vælge værdi for 'red', 'green', 'blue' og 'spred', så længe det er i procent (altså fra 1-100). Held og lykke med det.
Avatar billede exp Juniormester
23. oktober 2003 - 11:19 #17
thnx :-)

Jeg vender lige tilbage senere, tror nemlig lige måske jeg har et spørgsmål mere... men prøver lige selv først :-)
Avatar billede exp Juniormester
23. oktober 2003 - 11:19 #18
Men du kan jo lige lægge et svar for alle tilfælde ;-)
Avatar billede detox Nybegynder
23. oktober 2003 - 11:42 #19
Jep, jeg er først tilbage en gang i nat. c",)
Avatar billede exp Juniormester
29. oktober 2003 - 13:52 #20
Jeg har nu lavet det, så man blot smider en masse billeder i en mappe, scriptet finder derved _selv_ ud af hvor mange billeder der er i et array...

To eksempler kan ses her:
www.firewerx.dk/wish
www.firewerx.dk/koenigsegg

Tak for hjælpen.
Avatar billede detox Nybegynder
29. oktober 2003 - 13:56 #21
Det er faktisk rigtigt pænt! Og selv tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester