Avatar billede moddi100 Seniormester
25. februar 2008 - 18:15 Der er 57 kommentarer og
1 løsning

Udskrive oplysninger fra et array inde i et andet array

Hej allesammen

Jeg har flere arrays hvori jeg gemmer oplysninger om f.eks. de forskellige brugere. Det ser nogenlunde sådan ud:

$brugere = array('Jens' => array('password' => '1234', 'oplysning1' => 'bla', 'oplysning2' => 'blabla'),
'Gurlil' => array('password' => '4321', 'oplysning1' => 'alb', 'oplysning2' => 'albalb'));

$admin = array('Kong Gulerod' => array('password' => '5678', 'oplysning1' => 'adm_bla', 'oplysning2' => 'adm_blabla'),
'Prins Knud' => array('password' => '8765', 'oplysning1' => 'adm_alb', 'oplysning2' => 'adm_albalb'));

Jeg vil så gerne udskrive alle brugere og deres oplysninger, dog ikke deres passwords.
Hvordan vil I gribe det an?
Avatar billede moddi100 Seniormester
25. februar 2008 - 18:36 #1
Jeg havde tænkt mig af bruge foreach, men hvordan kan det laves så det passer??
Avatar billede nielle Nybegynder
25. februar 2008 - 18:38 #2
Sådan?

foreach ($brugere as $navn => $oplysninger) {
    echo "Brugeren: $navn:<br>";

    foreach ($oplysninger as $key => $value) {
        if ($key != 'password') {
            echo "$key = $value<br>";
        }
    }

    echo "<br>";
}
Avatar billede moddi100 Seniormester
25. februar 2008 - 18:51 #3
Så får jeg da også oplyst password??
Avatar billede moddi100 Seniormester
25. februar 2008 - 18:52 #4
Hvordan kan jeg overse det midterste!? Prøver det lige af...
Avatar billede moddi100 Seniormester
25. februar 2008 - 19:22 #5
Det virker fint. Hvis jeg så vil tildele lige præcis oplysning2 variablen '$opl2' er det vel så bare at sige:

foreach ($oplysninger as $key => $value) {
        if ($key == 'oplysning2') {

            $opl2 = $key;
        }
 
        // Jeg kan ikke skrive "echo $opl2;" her vel?
Avatar billede nielle Nybegynder
25. februar 2008 - 19:27 #6
Problemet med at gøre det på den måde er at du hele tiden mister den forrige værdi efterhånden som den ydre foreach løber igennem de forskellige personer. Den bliver overskrevet med den nye.
Avatar billede moddi100 Seniormester
25. februar 2008 - 20:06 #7
Det jeg vil, er at jeg vil præsentere de forskellige brugere og nogle oplysninger omkring dem i en tabel. Det vil nok blive noget i retning af:
echo "<table><tr><th style='text-decoration: underline'>Brugernavn</th><th style='text-decoration: underline'>Oplysning 1</th><th style='text-decoration: underline'>Oplysning 2</th></tr>";

foreach ($brugere as $navn => $oplysninger) {
    echo "<tr><td>$navn</td>";

    foreach ($oplysninger as $key => $value) {
        if ($key == 'oplysning1') {
            echo "<td>" . $value . "</td>";
        }
    }

    echo "</table>";
}

eller?
Avatar billede jakobdo Ekspert
25. februar 2008 - 20:17 #8
På den måde får kun udskrivet oplysning 1?
Måske noget i stil med:

echo "<table><tr><th style='text-decoration: underline'>Brugernavn</th><th style='text-decoration: underline'>Oplysning 1</th><th style='text-decoration: underline'>Oplysning 2</th></tr>";

foreach ($brugere as $navn => $oplysninger) {
    echo "<tr><td>$navn</td>";

    foreach ($oplysninger as $key => $value) {
        switch($key){
            case 'oplysning1':
                echo "<td><b>" . $value . "</b></td>";
                break;
            default:
                echo "<td>" . $value . "</td>";
        }
    }

    echo "</table>";
}
Avatar billede nielle Nybegynder
25. februar 2008 - 20:18 #9
Ville det ikke være bedre med:

    foreach ($oplysninger as $key => $value) {
        if ($key != 'password') {
            echo "<td>" . $value . "</td>";
        }
    }

... ellers ender du jo med mange if sætninger.
Avatar billede moddi100 Seniormester
25. februar 2008 - 20:26 #10
jeg kender ikke switch functionen men jeg ville bare sætte den lille stump kode som ovenover flere gange...
Avatar billede moddi100 Seniormester
25. februar 2008 - 20:27 #11
men vil ikke sige der kan komme for mange if sætninger. Jeg har et stykke med ca 12 elseif sætninger...
Avatar billede nielle Nybegynder
25. februar 2008 - 20:44 #12
switch() er et must at kende hvis man skal programmere seriøst:

http://dk2.php.net/switch

Men hvis du bare skal behandle netop password-feltet anderledes end alle de andre felter, så er en enkelt if altså nok.
Avatar billede jakobdo Ekspert
25. februar 2008 - 20:47 #13
Hvis det blot er for at undgå at udskrive password, så kan du "nøjes" med den løsning nielle kommer med ja.
Og switch er rar at kende, så undgår man mange if/else/if/else'er...
Avatar billede moddi100 Seniormester
25. februar 2008 - 20:48 #14
det er nu ikke blot password felterne, men også til nogle andre ting, men i samme stil.
Avatar billede nielle Nybegynder
25. februar 2008 - 20:50 #15
Hvis forskellige felter skal behandles forskelligt, så vil jeg nok anbefale switch'en.
Avatar billede moddi100 Seniormester
25. februar 2008 - 20:57 #16
de skal nok behandles ens. Kan i kort beskrive hvad og hvordan switch bruges?
Avatar billede nielle Nybegynder
25. februar 2008 - 21:02 #17
Prøv at kigge på linket fra før. :^)

En switch er egentlig blot en mere kompakt måde at skrive en masse:

if .. elseif ... elseif ... elseif ... else

på. Den gør det væsentlig nememer at læse koden.
Avatar billede moddi100 Seniormester
25. februar 2008 - 21:04 #18
okay
Avatar billede moddi100 Seniormester
25. februar 2008 - 21:27 #19
så hvordan ville koden komme til at se ud?
Avatar billede jakobdo Ekspert
25. februar 2008 - 21:31 #20
Håber måske dette kan vise dig mulighederne med switch: http://www.codebreaker.dk/exp/821111exp.php
Avatar billede nielle Nybegynder
25. februar 2008 - 21:33 #21
Det er altså ikke forbudt at prøve sig lidt frem selv...

Men, hvis vi skal give dig mere specifik kode skal vi nok vide noget mere om dit array, og hvordan du vil have opstillet det i din udskrift.
Avatar billede moddi100 Seniormester
25. februar 2008 - 21:53 #22
vender tilbage imorgen...
Avatar billede moddi100 Seniormester
26. februar 2008 - 07:45 #23
Bare lige til orientering kommer jeg nok først tilbage onsdag eftermiddag
Avatar billede moddi100 Seniormester
27. februar 2008 - 15:15 #24
okay jeg øsnker at lave en tabel hvor jeg udskriver forskellige data fra filen kampagner.php

I filen ligger oplysningerne sorteret i arrays:

$fatlott_dk = array('Jens' => array('bruger' => 'Jens', 'antal_klik' => '1', 'sidste_klik' => '1-1-08'), 'Gurlil' => array('bruger' => 'Gurlil', 'antal_klik' => '3', 'sidste_klik' => '4-2-08'), 'kr_pr_klik' => 'o,70');

$fatlott_com = array('Jens' => array('bruger' => 'Jens', 'antal_klik' => '1', 'sidste_klik' => '1-1-08'), 'Gurlil' => array('bruger' => 'Gurlil', 'antal_klik' => '3', 'sidste_klik' => '4-2-08'), 'kr_pr_klik' => 'o,70');
Avatar billede moddi100 Seniormester
27. februar 2008 - 15:34 #25
øverst i filen har jeg et array hvori alle kampagnenavnene ligger:

array('fatlott_dk', 'fatlott_com');

Filen hvor jeg vil udskrive oplysningerne ser sådan ud:

<?php

echo "<table width='80%'>
<tr>
<th>Kampagnenavn</th>
<th>Sidst klikket</th>
<th>antal klik</th>
<th>Kr pr klik</th>
<th>Optjent i alt</th>
</tr>

$antal_kampagner = count(kampagner);
for ($i=0;$i<=$antal_kampagner;$i++)
$kampagnenavn = '$' . $kampagner[$i];

foreach($kampagnenavn as $bruger => $oplysninger)
{


// Udskriv kampagnenavn
echo "<tr><td>" . $kampagnenavn . "</td>";

    foreach ($oplysninger as $key => $value) {
        switch($key){
            case 'sidste_klik':
                echo "<td>" . $value . "</td>";
                break;
            case 'antal_klik':
                echo "<td>" . $value . "</td>";
                break;
        }
    }
      // Her skal kr_pr_klik udskrives
    echo "<td>" . $kampagnenavn[$i]['kr_pr_klik] "</td>";

      // Her vil jeg gerne gange feltet antal_klik med kr_pr_klik
    echo "<td>" . ?????? . "</td></tr>";
}


Ser det nogenlunde rigtigt ud??
Avatar billede nielle Nybegynder
27. februar 2008 - 19:16 #26
Egentlig ikke. Kan du ikke præve at opstille en tabel som demonstrere hvordan du vil have det udskrevet - altså bare en endelige HTML kode?

Har dog et par kommentarer til dine arrrays:


1) Hvis du ønsker at kunne regne med dine tal - og det vil du jo når at du f.eks. ønsker at gange dem sammen - så skal de altså være skrevet som tal. Det betyder bla. at der ikke må være '-tegn rundt om dem, at du skal bruge emerikansk decimalpunktum i stedet for dansk decimalkomma og at du ikke må skrive et lille 'o' i stedet for en nul:

2) Du bliver nødt til at flytte oplysningen om kr_pr_klik om til starten af array'ene. Ellers har du ikke den pris før *efter* at du allerede har været igennem alle brugerene, og det er et problem hvis du gerne vil gange den der pris undervejs.

3) Du bliver nødt til at have arrayes værdier stående i den rækkefølge de skal skrives ud. Hvis du ønsker at sidste_klik skal udskrives før antal_klik, så skal den også stå før denne i arrayet.

Dine arrays skal derfor ændres til formen:

$fatlott_dk = array(
    'kr_pr_klik' => 0.7,
    'Jens' => array('bruger' => 'Jens', 'sidste_klik' => '1-1-08', 'antal_klik' => 1),
    'Gurlil' => array('bruger' => 'Gurlil', 'sidste_klik' => '4-2-08', 'antal_klik' => 3)
);
Avatar billede moddi100 Seniormester
28. februar 2008 - 07:26 #27
<tabel width="80%">
<tr>
  <th>Kampagnenavn</th>
  <th>Sidst klikket</th>
  <th>Antal klik</th>
  <th>kr pr klik</th>
  <th>Optjent i alt</th>
</tr>
<tr>
  <td>%Fatlott_dk%</td>
  <td>%1-1-08%</td>
  <td>%1%</td>
  <td>%0.7%</td>
  <td>%0.70%</td>
</tr>
</table>

Efter hav du siger kan jeg forstå at kr_pr_klik så skal bytte plads med sidste_klik??

Jeg ville gerne vise jer et eksempel ved at give jer adgang til det, men det er ikke muligt da jeg ikke har FTP adgang ligenu.

Men når det skal udregnes, er det så noget med at give felterne navne, altså noget med <td id='kr_pr_klik'> ??
Avatar billede nielle Nybegynder
28. februar 2008 - 08:24 #28
Der er 2 (eller flere?) personer i dine arrays. Skal tallene ikke vises for hver af dem? Hvis de skal, hvordan vil du så have det stillet op?

> Efter hav du siger kan jeg forstå at kr_pr_klik så skal bytte plads med sidste_klik??

Hvis du vil have det på den måde som i 28/02-2008 07:26:00 så er det bedst hvis 'sidste_klik' står før 'antal_klik' i arrayet.

> Jeg ville gerne vise jer et eksempel ved at give jer adgang til det, men det er ikke muligt da jeg ikke har FTP adgang ligenu.

Det er heller ikke vigtigt. Det vigtiger er at du fortæller hvordan det skals e ud. :^)

> Men når det skal udregnes, er det så noget med at give felterne navne, altså noget med <td id='kr_pr_klik'> ??

Nej, id'er kommer slet ikke ind i problemet.

PS: Desuden er det ulovlig HTML at bruge det samme id mere end et sted på siden.
Avatar billede moddi100 Seniormester
28. februar 2008 - 14:18 #29
Jeg har i sinde at lave det sådan at den bruger der er logget in, kan se sine data.
Jeg har tilføjet variablen $_SESSION['bruger'] brugernavnet. F.eks. Jens.

<Hvis du vil have det på den måde som i 28/02-2008 07:26:00 så er det bedst hvis 'sidste_klik' står før 'antal_klik' i arrayet.

Hvordan vil du stille det før i arrayet? Vil du under bruger tilføje værdien kr_pr_klik??

<PS: Desuden er det ulovlig HTML at bruge det samme id mere end et sted på siden.

Jeg tænkte på at skrive noget i retning af id=$i...
Avatar billede nielle Nybegynder
28. februar 2008 - 18:25 #30
> Hvordan vil du stille det før i arrayet? Vil du under bruger tilføje værdien kr_pr_klik??

Jeg forslået at du opstiller det som vist i 27/02-2008 19:16:00

> Jeg tænkte på at skrive noget i retning af id=$i...

Nope, jeg kan ikke lige se hvad du overhovedet skulle bruge det til.

> Jeg har i sinde at lave det sådan at den bruger der er logget in, kan se sine data.
> Jeg har tilføjet variablen $_SESSION['bruger'] brugernavnet. F.eks. Jens.

Det er nu altså altid en god ide at medtage alle de relevante oplysninger når man stiller sit spørgsmål!

Mit foreløbige bedste bud:

<?php
echo "<table width='80%'>
<tr>
<th>Kampagnenavn</th>
<th>Sidst klikket</th>
<th>antal klik</th>
<th>Kr pr klik</th>
<th>Optjent i alt</th>
</tr>";

$antal_kampagner = count($kampagner);

for ($i=0; $i<=$antal_kampagner; $i++) {
    $kampagnenavn = '$' . $kampagner[$i];

    echo "<tr>";

    // Udskriv kampagnenavn.
    echo "<td>" . $kampagnenavn . "</td>";

    foreach ($$kampagnenavn as $key1 => $value1) {

        // Hvis det er kr_pr_klik posten, så gem den og fortsæt med næste foreach.
        if ($key1 == 'kr_pr_klik') {
            $kr_pr_klik = $value1;
            continue;
        }

        // HVis det ikke er den rigtige bruger, så fortsæt med næste foreach.
        if ($key1 != $_SESSION['bruger']) {
            continue;
        }

        // Vi kommer kun hertid hvis det er den rigtig bruger.
        // Hvis strukturen ligger fast er der strengt taget ikke brug for en foreach her...
        foreach ($value1 as $key2 => $value2) {
            switch ($key2) {
                case 'sidste_klik':
                    echo "<td>" . $value2 . "</td>";
                    break;
                case 'antal_klik':
                    echo "<td>" . $value2 . "</td>";
                    $antal_klik = $value2;
                    break;
            }
        }

        // Her skal kr_pr_klik udskrives.
        echo "<td>" . $kr_pr_klik . "</td>";

        // Optjent i alt.
        echo "<td>" . ($kr_pr_klik * $antal_klik) . "</td></tr>";

    }
}

echo "</table>";
?>
Avatar billede moddi100 Seniormester
29. februar 2008 - 22:31 #31
Jeg får fejlen:

Warning: Invalid argument supplied for foreach() in /web/www/frac/users/m/moddi/bannersite/test.php on line 23

og det er den med $kampagnenavn
Avatar billede moddi100 Seniormester
29. februar 2008 - 23:24 #32
Her kan du selv se det:

www.moddi.frac.dk/bannersite/bannere.php

Brugernavn: Gæst
Password: 1234
Avatar billede moddi100 Seniormester
29. februar 2008 - 23:24 #33
Kig under menuen 'kontooversigt'
Avatar billede nielle Nybegynder
01. marts 2008 - 08:18 #34
Hvor er $kampagner); defineret henne, og hvordan ser det ud?
Avatar billede moddi100 Seniormester
01. marts 2008 - 11:05 #35
i filen kampagner. Det der ikke virker er navnet:
$kampagnenavn = '$' . $kampagner;

Hvis jeg ændrer den til $fatlott_dk så udskriver den noget, men ellers får jeg fejl
Avatar billede nielle Nybegynder
01. marts 2008 - 12:51 #36
Du har stadig ikke vist hvordan $kampagner ser ud.
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:00 #37
$kampagner = array('fatlott_dk', 'fatlott_com');

Jeg har prøvet at lave noget lignende med

echo $brugere[$bruger][$oplysning];

Hvor jeg også hentede navnene ud af et array, men det virkede bare ikke selvom at jeg kunne få den til at udskrive den korrekte sti. Den opfatter det altså ikke som en variabel...
Avatar billede nielle Nybegynder
01. marts 2008 - 13:14 #38
Det ser da ud til at væreke på dit link?

Men jeg kan se at du stadig bruger decimalkomma i dine tal - du skal bruge decimalpunktum.
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:15 #39
Hovsa det er fordi at jeg har skrevet $fatlott_dk i stedet for $kampagner
Avatar billede nielle Nybegynder
01. marts 2008 - 13:17 #40
Hvad mener du med "hovsa" ?
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:17 #41
prøv så at kigge nu
Avatar billede nielle Nybegynder
01. marts 2008 - 13:17 #42
Du skal forresten lige rette:

for ($i=0; $i<=$antal_kampagner; $i++) {

til:

for ($i=0; $i<$antal_kampagner; $i++) {
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:18 #43
Det at jeg ikke havde oploadet den nyeste version af filen
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:19 #44
Sådan er gjort nu
Avatar billede nielle Nybegynder
01. marts 2008 - 13:20 #45
Hvilken linje er nr. 23?
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:21 #46
Det er denne linje:

foreach ($kampagnenavn as $key1 => $value1) {
Avatar billede nielle Nybegynder
01. marts 2008 - 13:23 #47
DeN skulle jo være:

foreach ($$kampagnenavn as $key1 => $value1) {

- med dobbelt $-tegn.

...

Ret i øvrigt lige:

$kampagnenavn = '$' . $kampagner[$i];

til:

$kampagnenavn = $kampagner[$i];
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:26 #48
Okay. Troede det med dobbelt $$ var en fejl. Da jeg havde det sådan fik jeg nemlig også en fejl, men så vidt jeg kan se virker det nu.
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:28 #49
Jeg har lige tilføjet border, så prøv lige at tage et kig. Det ser lidt underligt ud.
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:29 #50
Fandt fejlen. Men hvordan viser jeg optjent ialt med to decimaler??
Avatar billede nielle Nybegynder
01. marts 2008 - 13:29 #51
Du havde da eller tal med lige før. Hvorfor forsvandt de?
Avatar billede nielle Nybegynder
01. marts 2008 - 13:31 #52
Det gøv number_format() funktionen for dig:

http://dk2.php.net/number_format

... noget i denne stil:

$dansk_formateret_tal = number_format($tal, 2, ',', '.');
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:31 #53
havde sat /* og */ uden om

if ($key1 != $_SESSION['bruger']) {
continue;
}

men så viste den en hel masse andet. Der ikke hørte til.
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:35 #54
så hvis jeg nu laver denne kode om:

echo "<td align='center'>" . ($kr_pr_klik * $antal_klik) . "</td></tr>";

til denne:

$optjent_ialt = $kr_pr_klik * $antal_klik;
dansk_formateret_tal = number_format($optjent_ialt, 2, ',', '.');
echo "<td align='center'>" . $optjent_ialt . "</td></tr>";
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:37 #55
Rettelse:

$dansk_formateret_tal = number_format($optjent_ialt, 2, ',', '.');
echo "<td align='center'>" . $dansk_formateret_tal . "</td></tr>";
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:38 #56
Nå nu må det vist være på tide at du smider et svar og får dine velfortjente point!
Avatar billede nielle Nybegynder
01. marts 2008 - 13:38 #57
Svar :^)
Avatar billede moddi100 Seniormester
01. marts 2008 - 13:39 #58
I hvert fald tusind tak for hjælpen!!
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