Avatar billede Thomasrn Seniormester
11. april 2019 - 15:25 Der er 17 kommentarer

array_rand

hej i gang med at lave et array random hvor den skal lave random navne kode ser således ud

$rannavn = array('Thomas','Tobias','Claus','Mark','Markus','Olaf');
$fuldenavn = $rannavn[array_rand($rannavn)];

virker fint men vil gerne have at når den har lavet alle 6 navne og man prøver at oprette en til bliver den sendt tilbage til en af mine andre sider nogle der har en ide til hvad jeg kan gøre?
Avatar billede olsensweb.dk Ekspert
11. april 2019 - 15:44 #1
hurtig tanke
kan du ikke bare lave et array af brugte navne ??, og så teste om det valgte navn er i array'et af brugte navne ??
kig på https://www.php.net/manual/en/function.in-array.php
Avatar billede Slater Ekspert
11. april 2019 - 15:58 #2
Eller bare bruge array_splice i stedet.

$rannavn = array('Thomas','Tobias','Claus','Mark','Markus','Olaf');
$fuldenavn = array_splice($rannavn, array_rand($rannavn), 1);

Så forsvinder det valgte navn fra den oprindelige array, så når der ikke er flere tilbage, kan man gøre noget andet.
Avatar billede Thomasrn Seniormester
12. april 2019 - 11:22 #3
når jeg skriver denne kode:
$rannavn = array('Thomas','Tobias','Claus','Mark','Markus','Olaf');
$fuldenavn = array_splice($rannavn, array_rand($rannavn), 1);
bliver fulde navn bare array hvordan kan det være?
Avatar billede Slater Ekspert
12. april 2019 - 12:41 #4
Det er fordi array_splice kan hive mere end én ud ad gangen, derfor returnerer den en array. Men der vil altid kun være én på denne måde, så du kan bare bruge $fuldenavn[0] eller current($fuldenavn) til at få navnet.
Avatar billede Thomasrn Seniormester
17. april 2019 - 16:52 #5
$firstnavn = array('Thomas','Tobias','Claus','Mark','Markus','Olaf');
$first = $firstnavn[array_rand($firstnavn)];
$lastname = array('Thomasen','Tobiasen','Clausen','Marken','Markusen','Olafen');
$last = $lastname[array_rand($lastname)];
$fuldenavn = "$first $last";
lavet denne printer det fint ud men skal man lave en if sætning om den er der i forvejen eller hvad for synes ikke jeg kan læse mig frem til noget kan selvfølgelig kan jeg lave en uniktabel under fuldenavn i databasen men vil kan have den laver et loop indtil den finder et navn der ikke finde i databasen i forvejen
Avatar billede Slater Ekspert
18. april 2019 - 13:45 #6
Du er nok lige nødt til at forklare hvad det er du gerne vil have det til.

Ønsker du at generere en liste af unikke navne, med både for- og efternavn, sådan at der ikke er to ens navne til sidst, men så vidt muligt alle navnene er brugt?
Avatar billede Thomasrn Seniormester
18. april 2019 - 15:24 #7
ja har lavet en knap hvor man trykker lav spiller og så laver den en spiller med stats og alt det plus generer et navn men vil gerne have der kun findes en spiller med samme navn så der er ikke 2 der må hedde eksempel "Kim Larsen" så hvis den får navnet "Kim Larsen" igen skal den genere et andet navn ud fra de random navne den kan vælge
Avatar billede Slater Ekspert
18. april 2019 - 15:55 #8
Og de er i en database?

Med mindre du har rigtig mange navne, vil jeg nok anbefale at du henter alle de eksisterende ud af databasen på én gang, når du skal generere et nyt navn, og gemmer dem i et PHP-array, som du så kan sammenligne med.

Så kan du køre en løkke som "while (in_array($fuldenavn, $eksisterende_navne))", og blive ved med at generere et nyt, så længe den kører.
Avatar billede olsensweb.dk Ekspert
18. april 2019 - 16:14 #9
prøv at lege med denne

<?php
// kunne også være en sql tabel
$names = array(
    array("first"=>"Thomas", "last"=>"Thomasen"),
    array("first"=>"Thomas", "last"=>"hansen"),   
    //array("first"=>"Tobias", "last"=>"Tobiassen"),
    //array("first"=>"Claus", "last"=>"Claussen"),
    //array("first"=>"Mark", "last"=>"Marksen"),
    array("first"=>"Markus", "last"=>"Markussen"),
    array("first"=>"Olaf", "last"=>"Olafsen")   
);





// $needle=array("first"=>"Mark", "last"=>"Marksen");
$firstname_row = array_rand($names);
$lastname_row = array_rand($names);
$needle=array("first"=>($names[$firstname_row]["first"]), "last"=>($names[$lastname_row]["last"]));

// print_r($names);
// print_r($firstname_row);
// print_r($lastname_row);
// print_r($needle);



$index=-1;
for($i=0, $lng=count($names); $i<$lng;$i++){
    if($names[$i]["first"]== $needle["first"] AND $names[$i]["last"]== $needle["last"]){
        $index=$i;
        break; // der er ikke grund til at lede vidre
    }   
}

echo $needle["first"]." ".$needle["last"]." " . ($index >=0)? "fundet" : "Ej fundet";
?>


hvis du ligger det i en tabel, hvilke jeg ville gøre, kunne du også lege med IN i mysql
https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in

jeg vil nok holde fast i at opdelew fornavn efternavn i 2 felter
Avatar billede Thomasrn Seniormester
18. april 2019 - 16:35 #10
slater de bliver gemt i databasen og regner med der bliver oprettet op mod 1000 spiller så tænker det vil tage lidt tid når de skal hentes ud af databasen er der ikke en if $fuldenavn (findes i databasen generer den et nyt random navn)
Avatar billede olsensweb.dk Ekspert
18. april 2019 - 17:00 #11
>gemt i databasen og regner med der bliver oprettet op mod 1000 spiller så tænker det vil tage lidt tid når de skal hentes ud af databasen
du kan forbedre hastigheden ved at indexere dine colloner
https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html

du kan hente dem ud fra mysql med DISTINCT, så sammen fornavn / efternavn ikke kommer flere gange
https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html


>er der ikke en if $fuldenavn (findes i databasen generer den et nyt random navn)
https://forums.mysql.com/read.php?10,356839
https://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists
Avatar billede olsensweb.dk Ekspert
18. april 2019 - 17:08 #12
hvofor lave array i php?? er det ikke nemmere bare at søge direkte i sql ??
og kigge på ROW_COUNT, er den 0 findes det ikke, så kan du indsætte, ellers må du lave en ny
https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_row-count
Avatar billede Thomasrn Seniormester
18. april 2019 - 17:20 #13
vil det så ikke give det samme som at gøre fuldenavn unik i databasen?
Avatar billede olsensweb.dk Ekspert
18. april 2019 - 18:41 #14
hvorfor ikke bruge brugerens email, eller telefon nummer som brugernavn ??
hvorfor ikke lade brugeren selv lave et brugernavn ?? og teste om det findes allerede, og hvisdet findes tvinge brugeren til at lave et nyt
hvorfor ikke lave et random brugernavn, lige som når man laver et password til brugeren

fuldenavn vil ikke være anvendelig som brugernavn, da der nemt kunne være flere der hedder "hans nielsen", nogle skifter ægteskabelig status, og dermed eftrenavn, skal de så også skifte brugernavn
brugernavn skal være Unique
Avatar billede Thomasrn Seniormester
18. april 2019 - 18:49 #15
for vil gerne ha de får et ordentligt navn så de ikke får nogle navne som ingen mening giver
Avatar billede olsensweb.dk Ekspert
18. april 2019 - 19:01 #16
hvad tvinger dig til at vise brugernavn ?? du kan da sagtens vise fornavn efternavn eller noget helt andet.
hvis du kigger her på E er viste navn ikke det samen som brugernavn (email)
Avatar billede Thomasrn Seniormester
18. april 2019 - 19:13 #17
tror ikke du er helt med de spiller jeg opretter bliver ikke nogle man skal kunne logge ind op nogle brugerne skal kunne købe for kredit de tjener du kan tjekke ud hvor langt jeg er pt her.
http://starmanager.z5.dk/opretbruger/index.php
login:
larslarsen@hotmail.com
kode: 123456
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

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