Avatar billede lsskaarup Nybegynder
22. februar 2005 - 10:16 Der er 23 kommentarer og
1 løsning

Hjælp til at gøre array-udtræk "mere" dynamisk

Jeg skal lige have lidt hjælp til at gøre et array-udtræk mere dynamisk. Jeg har følgende kode til at finde data i et mulitdimensionelt array.

for ($i=1;$i<=sizeof($KOSTPRIS1); $i++) {
        for ($j=1;$j<=15; $j++) $KOSTPRIS1[$i][$j] = str_replace(',','.',$KOSTPRIS1[$i][$j]);
        echo "kost1[".$i."] = new Array('".$KOSTPRIS1[$i][1]."','".$KOSTPRIS1[$i][2]."','".$KOSTPRIS1[$i][3]."','".$KOSTPRIS1[$i][4]."','".$KOSTPRIS1[$i][5]."','".$KOSTPRIS1[$i][6]."','".$KOSTPRIS1[$i][7]."','".$KOSTPRIS1[$i][8]."','".$KOSTPRIS1[$i][9]."','".$KOSTPRIS1[$i][10]."','".$KOSTPRIS1[$i][11]."','".$KOSTPRIS1[$i][12]."','".$KOSTPRIS1[$i][13]."','".$KOSTPRIS1[$i][14]."','".$KOSTPRIS1[$i][15]."','".$KOSTPRIS1[$i][16]."','".$KOSTPRIS1[$i][17]."','".$KOSTPRIS1[$i][18]."');\n";
    }

Det vil sige, at jeg i stedet for $j=<15 gerne skulle have en størrelse på arrayet, hvilket jeg regnede med kunne gøres f.eks. sådanne $j=<sizeof($KOSTPRIS1[$i]) men når jeg sætter det ind, får jeg slet ikke noget smidt ud til browseren, så noget tyder på at den aldrig bliver færdig. Derudover skal jeg have kodet echo'en sådan, at den automatisk skriver alle array-felter ud, og ikke stopper ved f.eks. 15, når der ud måske kunne være 20 værdier i arrayet.
Avatar billede yellow Nybegynder
22. februar 2005 - 10:39 #1
Kan ikke lige gennemskue hvad du vil ha som output, men kan give et eksempel som du sikkert kan modificere til dit behov.

<?
$KOSTPRIS1 = array(
  'A'=>array(
    'A,1',
    'A,2',
    'A,3'
  ),
  'B'=>array(
    'B,1',
    'B,2',
    'B,3'
  ),
  'C'=>array(
    'C,1',
    'C,2',
    'C,3'
  )
);
foreach( $KOSTPRIS1 as $first=>$second )
{
  echo "$first<br>";
  foreach( $second as $item )
  {
    echo " --> " . str_replace(",",".",$item) ."<br>";
  }
}

?>
Avatar billede sukos Juniormester
22. februar 2005 - 10:40 #2
ehh, hvordan ser dit array ud?
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 11:04 #3
Mit array ser sådanne ud:

$KOSTPRIS1 = array();
$KOSTPRIS1[1] = array('0','12,13','11,05','11,63','12,38','11,30','11,88','12,78','11,70','12,28','13,18','12,10','12,68','14,03','12,95','13,53','14,03','12,95','13,53');

$KOSTPRIS1[2] = array('0','11,23','9,30','10,73','11,48','9,55','10,98','11,88','9,95','11,38','12,28','10,35','11,78','13,13','11,20','12,63','13,13','11,20','12,63');

$KOSTPRIS1[3] = array('0','10,23','8,80','9,73','10,48','9,05','9,98','10,88','9,45','10,38','11,28','9,85','10,78','12,13','10,70','11,63','12,13','10,70','11,63');

$KOSTPRIS1[4] = array('0','9,57','8,45','9,07','9,82','8,70','9,32','10,22','9,10','9,72','10,62','9,50','10,12','11,47','10,35','10,97','11,47','10,35','10,97');

$KOSTPRIS1[5] = array('0','9,38','8,45','8,88','9,63','8,70','9,13','10,03','9,10','9,53','10,43','9,50','9,93','11,28','10,35','10,78','11,28','10,35','10,78');

$KOSTPRIS1[6] = array('0','9,00','8,45','8,50','9,25','8,70','8,75','9,65','9,10','9,15','10,05','9,50','9,55','10,90','10,35','10,40','10,90','10,35','10,40');

$KOSTPRIS1[7] = array('0','8,95','8,45','8,45','9,20','8,70','8,70','9,60','9,10','9,10','10,00','9,50','9,50','10,85','10,35','10,35','10,85','10,35','10,35');

$KOSTPRIS1[8] = array('0','8,90','8,45','8,40','9,15','8,70','8,65','9,55','9,10','9,05','9,95','9,50','9,45','10,80','10,35','10,30','10,80','10,35','10,30');

Derudover er der så 4 kostprisarrays, som ikke ser nogenlunde lige sådan ud, pointen er at de alle kan ændres af brugerne af systemet, og derfor skal jeg have den til at løbe dynamisk i gennem både det "øverste" array og det "inderste" array.
Avatar billede sukos Juniormester
22. februar 2005 - 11:12 #4
Er nu ikke helt med på hvad du vil

<?php

$KOSTPRIS1 = array();
$KOSTPRIS1[] = array('0','12,13','11,05','11,63','12,38','11,30','11,88','12,78','11,70','12,28','13,18','12,10','12,68','14,03','12,95','13,53','14,03','12,95','13,53');

$KOSTPRIS1[] = array('0','11,23','9,30','10,73','11,48','9,55','10,98','11,88','9,95','11,38','12,28','10,35','11,78','13,13','11,20','12,63','13,13','11,20','12,63');

$KOSTPRIS1[] = array('0','10,23','8,80','9,73','10,48','9,05','9,98','10,88','9,45','10,38','11,28','9,85','10,78','12,13','10,70','11,63','12,13','10,70','11,63');

$KOSTPRIS1[] = array('0','9,57','8,45','9,07','9,82','8,70','9,32','10,22','9,10','9,72','10,62','9,50','10,12','11,47','10,35','10,97','11,47','10,35','10,97');

$KOSTPRIS1[] = array('0','9,38','8,45','8,88','9,63','8,70','9,13','10,03','9,10','9,53','10,43','9,50','9,93','11,28','10,35','10,78','11,28','10,35','10,78');

$KOSTPRIS1[] = array('0','9,00','8,45','8,50','9,25','8,70','8,75','9,65','9,10','9,15','10,05','9,50','9,55','10,90','10,35','10,40','10,90','10,35','10,40');

$KOSTPRIS1[] = array('0','8,95','8,45','8,45','9,20','8,70','8,70','9,60','9,10','9,10','10,00','9,50','9,50','10,85','10,35','10,35','10,85','10,35','10,35');

$KOSTPRIS1[] = array('0','8,90','8,45','8,40','9,15','8,70','8,65','9,55','9,10','9,05','9,95','9,50','9,45','10,80','10,35','10,30','10,80','10,35','10,30');


echo count($KOSTPRIS1);

echo"<p>";

foreach($KOSTPRIS1 as $key => $value) {

    foreach($value as $vaerdi) {
    $vaerdi = str_replace(",", ".", $vaerdi);
    echo $vaerdi ."<br>";
    }
}

?>
Avatar billede sukos Juniormester
22. februar 2005 - 11:13 #5
Eller
foreach($KOSTPRIS1 as $key => $value) {

    foreach($value as $vaerdi) {
    $vaerdi = str_replace(",", ".", $vaerdi);
    echo $vaerdi ." - ";
    }
echo"<br>";
}
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 11:19 #6
Hov jeg glemte da vist lige en lille dif. af kost1, hvilket godt nok er i javascript.

var kost1 = new Array();
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 11:25 #7
Så jeg skal altså have lagt de udtrukne værdier over i det nye array "kost1", idet jeg senere kalder f.eks.

kost1[1][<?php echo $p; ?>];

for at få den enkelte værdi ud. $p er bare en simpel udregning, som jeg laver andet steds, for at kunne finde præcist den enkelte værdi.
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 11:42 #8
Okay, jeg tror jeg har fundet en løsning ud fra sukos kode. Men jeg er ikke helt sikker på at det virker korrekt, tester det lige.

var kost1 = new Array();
<?php
foreach($KOSTPRIS1 as $key => $value) {
    foreach($value as $vaerdi) {
        $vaerdi = str_replace(",", ".", $vaerdi);
        echo "kost1[".$key."] = new Array('".$vaerdi."');\n";
        }
}
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 12:04 #9
Damn det holder ikek helt, jeg får bare overskrevet f.eks kost1[1] og ikke gemt alle værdier.
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 12:09 #10
Jeg skal sådan set have skrevet dette ud:

echo "kost1[".$key."][#1 - max antal] = $vaerdi;\n";

Men hvordan får jeg den til at tælle op, så jeg kan bruge en dynamisk variabel i stedet for [#1 - max antal]?
Avatar billede sukos Juniormester
22. februar 2005 - 12:12 #11
Det er vel så'n:

foreach($KOSTPRIS1 as $key => $value) {
echo "kost1[".$key."] = new Array('";

    foreach($value as $vaerdi) {
        $vaerdi = str_replace(",", ".", $vaerdi);
        echo $vaerdi .",";
        }
echo"');\n";
}
Avatar billede sukos Juniormester
22. februar 2005 - 12:13 #12
Dit indlæg, 12:09:48 er jeg ikke lige med på! :O)
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 12:28 #13
Nej, det er fordi der længere nede i koden bliver refereret til arrayetpladsen kost1[1][15], og for ikke at skulle lave for meget om, vil jeg gerne have outputtet til at være f.eks. kost1[1][1] = værdi1, kost2[1][2] = værdi2 osv. osv.

Så det vil altså sige, at den anden parameter i kost1 arrayet, skal tælles op alt efter hvor mange der ud er.

Forestil dig en stor tabel. De forskellige rækker er i dette tilfælde $key. De forskellige kolonner eller mere specifikt celler, skal jeg så have talt op, så jeg kan få den værdi som anden parameter i kost1[][]. På eventuelt at se nedenstående tegning

        kost1[1][1]  kost1[1][2]  kost1[1][3]    kost1[1][4]
        --------------------------------------------------------
kost1[1]|          |            |            |              |
        --------------------------------------------------------       
kost1[2]|          |            |            |              |
        --------------------------------------------------------
        kost1[2][1]  kost1[2][2]  kost1[2][3]    kost1[2][4]
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 12:29 #14
Ja, hold da op, det ser godt ud, håber det forklarer godt nok
Avatar billede sukos Juniormester
22. februar 2005 - 12:41 #15
Jeg er slet ikke med på hvilket output du gerne vil ha', men du kan jo tælle $value eller lægge dem sammen
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 13:05 #16
Okay, i den første celle står der f.eks. 12,02. Den kaldes senere ved at sige var x=kost1[1][1]. [1][1] fordi det er den første række og den første kolonne. Derfor vil jeg gerne have at værdien, som jeg fidner bliver lagt over i f.eks. arrayet kost1[1][1], hvor den sidste [] står for kolonnenummeret.
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 13:29 #17
Vi kan også prøve at gå tilbage til udgangspunktet.

for ($i=1;$i<=sizeof($KOSTPRIS1); $i++) {

Løber arrayet $KOSTPRIS1 igennem, altså tæller hvor mange nye arrays der er, dem sammenlignede jeg tidligere med rækker.

for ($j=1;$j<=15; $j++)

Løber så det enkelte array igennem 15 gange, tidligere sammenlignet med kolonner, men hvad nu hvis der kommer flere, så kommer de ikke med i resultatet. Derfor vil jeg gerne have at den også her løber dynamisk igennem det enkelte array.

$KOSTPRIS1[$i][$j] = str_replace(',','.',$KOSTPRIS1[$i][$j]);

Omformer "," til ".", ikke så vigtig i dette spørgsmål, men skal med.

echo "kost1[".$i."] = new Array('".$KOSTPRIS1[$i][1]."','".$KOSTPRIS1[$i][2]."','".$KOSTPRIS1[$i][3]."','".$KOSTPRIS1[$i][4]."','".$KOSTPRIS1[$i][5]."','".$KOSTPRIS1[$i][6]."','".$KOSTPRIS1[$i][7]."','".$KOSTPRIS1[$i][8]."','".$KOSTPRIS1[$i][9]."','".$KOSTPRIS1[$i][10]."','".$KOSTPRIS1[$i][11]."','".$KOSTPRIS1[$i][12]."','".$KOSTPRIS1[$i][13]."','".$KOSTPRIS1[$i][14]."','".$KOSTPRIS1[$i][15]."','".$KOSTPRIS1[$i][16]."','".$KOSTPRIS1[$i][17]."','".$KOSTPRIS1[$i][18]."');\n";
    }

Skriver så værdierne ud i én lang køre, og jeg kan så efterfølgende ved at skrive f.eks. kost1[1][2] få værdien som ligger i række 1 og kolonne 2, for at blive i tabel-termologien
Avatar billede yellow Nybegynder
22. februar 2005 - 14:41 #18
ok, prøv lige den her. Er det sådan du vil have det?:

<?
$KOSTPRIS1 = array();
$KOSTPRIS1[1] = array('0','12,13','11,05','11,63','12,38','11,30','11,88','12,78','11,70','12,28','13,18','12,10','12,68','14,03','12,95','13,53','14,03','12,95','13,53');
$KOSTPRIS1[2] = array('0','11,23','9,30','10,73','11,48','9,55','10,98','11,88','9,95','11,38','12,28','10,35','11,78','13,13','11,20','12,63','13,13','11,20','12,63');
$KOSTPRIS1[3] = array('0','10,23','8,80','9,73','10,48','9,05','9,98','10,88','9,45','10,38','11,28','9,85','10,78','12,13','10,70','11,63','12,13','10,70','11,63');
$KOSTPRIS1[4] = array('0','9,57','8,45','9,07','9,82','8,70','9,32','10,22','9,10','9,72','10,62','9,50','10,12','11,47','10,35','10,97','11,47','10,35','10,97');
$KOSTPRIS1[5] = array('0','9,38','8,45','8,88','9,63','8,70','9,13','10,03','9,10','9,53','10,43','9,50','9,93','11,28','10,35','10,78','11,28','10,35','10,78');
$KOSTPRIS1[6] = array('0','9,00','8,45','8,50','9,25','8,70','8,75','9,65','9,10','9,15','10,05','9,50','9,55','10,90','10,35','10,40','10,90','10,35','10,40');
$KOSTPRIS1[7] = array('0','8,95','8,45','8,45','9,20','8,70','8,70','9,60','9,10','9,10','10,00','9,50','9,50','10,85','10,35','10,35','10,85','10,35','10,35');
$KOSTPRIS1[8] = array('0','8,90','8,45','8,40','9,15','8,70','8,65','9,55','9,10','9,05','9,95','9,50','9,45','10,80','10,35','10,30','10,80','10,35','10,30');

function printJS($array, $index){
  echo "kost1[$index] = new Array('" . implode("','", array_map(create_function('$str','return str_replace(\',\',\'.\',$str);'),$array)) . "');\n";
}
array_walk($KOSTPRIS1, 'printJS');
?>
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 15:29 #19
Ja både og, det kommer ud som jeg vil have det, men det endelige slut resultat er ikke rigtigt, og jeg har ikke ændret på nogle udregninger og de har virket korrekt tidligere i dag, så jeg tror at der et eller andet sted bliver cyklet noget forkert igennem.
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 15:31 #20
Men hvad er det lige du udfører
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 15:46 #21
Så fandt jeg fejlene. Den tæller åbenbart ikke med 0, så en mellemregning, for at få den til at pege på den rigtige, skulle lige ændres lidt.

Så skal jeg bare lige tjekke om den virker på alle de ting den skal virke på.
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 15:56 #22
Jeps, så kører det sgu, puha det holdt hårdt. Så Yellow hvis du smider en svar.

Men det der array_map(create_function(... hvad gør det lige.
Avatar billede yellow Nybegynder
22. februar 2005 - 16:21 #23
array_walk og array_map udfører en funktion på alle elementer i et array.
De er næsten ens, men ved array_walk får du index'et med (skulle bruges til at lave "kost1[$index]".

Den inderste - array_map - bruger jeg bare til at lave replace (, til .) funktionen på alle elementerne.

Kan skrive det samme med nogle løkker...men det bliver så rodet efter min mening :-)
Avatar billede lsskaarup Nybegynder
22. februar 2005 - 17:26 #24
Okay, jeg synes altid det er rat at vide, hvad ens, i dette tilfælde din ;-), kode gør.

Tak for hjælpen og så til din sukos.
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