Avatar billede zac Nybegynder
03. december 2005 - 20:02 Der er 19 kommentarer og
1 løsning

Hvorfor giver array($variabel) kun keys som er 0?

Har en numerisk variabel $nr fra en MySQL-query select.
Ex: $nr antager 4 værdier: 1, 2, 4 og 7.
$arr = array($nr); //gør $nr til et array
print_r($arr); // printer array'et ud
Resultatet:
Array ( [0] => 1 )
Array ( [0] => 2 )   
Array ( [0] => 4 )
Array ( [0] => 7 )

Men skulle array'et ikke indexere med en sekvens af (her 4) tal: 0, 1, 2, 3?

Og i alle tilfælde: Hvordan får jeg knyttet disse keys til arrayet/ værdierne 1,2,4,7?
Avatar billede erikjacobsen Ekspert
03. december 2005 - 20:04 #1
$arr=Array();
while (....) {
  ...
  $arr[]=$nr;
}
print_r($arr);
Avatar billede zac Nybegynder
03. december 2005 - 20:30 #2
Den forstår jeg ikke...
Kan ikke se, hvor while løkken kommer ind, jeg arbejdet allerede ind i en while løkke, hvor $nr = $row["nr"]; - og så er det, jeg vil bruge nummeret (som er knyttet til afsnit, der vises efter hianden, så pil ned vil føre til næste afsnit vha. nr. - men da der ofte er spring i numrene, har jeg brug for keys).

Og uden while'n, dvs.
$arr=Array($nr);
$arr[]=$nr;
print_r($arr);
får jeg ikke meget mere/ bedre end oprindeligt: Array ( [0] => 1 [1] => 1 ), Array ( [0] => 2 [1] => 2 ) osv. med =>4,7 ---hvorfor lige (kun) [0] og [1]?
Avatar billede erikjacobsen Ekspert
03. december 2005 - 20:33 #3
Min while løkke er det samme som din while løkke.
Avatar billede zac Nybegynder
03. december 2005 - 20:53 #4
ok - meen:
$arr=Array();
$arr[]=$nr;
print_r($arr);
giver:
Array ( [0] => 1 )
Array ( [0] => 2 )
Array ( [0] => 4 )
Array ( [0] => 7 )
Avatar billede erikjacobsen Ekspert
03. december 2005 - 21:09 #5
Det er vel heller ikke det jeg foreslår.
Avatar billede zac Nybegynder
03. december 2005 - 21:20 #6
Nej, du vil printe udenfor løkken - men det er indenfor, jeg gerne vil bruge $arr[]!
Og print_r($arr); udenfor løkken giver denne her: Array ( [0] => 6 )
Avatar billede erikjacobsen Ekspert
03. december 2005 - 21:22 #7
Tjah, det er det bedste forslag ud fra de givne oplysninger ;)
Avatar billede zac Nybegynder
03. december 2005 - 21:45 #8
takker for forsøget, prøver videre i lidt forskellige retninger
Avatar billede erikjacobsen Ekspert
03. december 2005 - 21:45 #9
Du skal bare forklare hvad du vil.
Avatar billede zac Nybegynder
04. december 2005 - 15:34 #10
Det er præcis som du siger!
$arr=Array(); //skal uden for løkken
while (....) {
  ...
  $arr[]=$nr;
}
print_r($arr);  //også uden for løkken

Så giver det de rigtige resultater, men:
Jeg skulle gerne bruge $arr[]=$nr; inden for løkken, og selv om jeg kan se fra print_r($arr), at det er det rigtige, som findes, hvordan så udnytte $arr[]=$nr; inden for løkken?
$arr[]=$nr; selv giver ikke noget, og echo $arr[]; låser systemet.
Jeg skal vel have fyldt noget - i eller $i - i []?
Har prøvet i tågen om den her giver noget, men nej, tavshed:
$num = count($nr);
for ($i = 1; $i < $num; $i++)
{
  echo $arr[$i];
}
(og noget med "for" giver nyt gennemløb inden i while løkken, og det kan vel heller ikke være meningen?)
Avatar billede zac Nybegynder
04. december 2005 - 15:44 #11
Måske skulle jeg også lige sige, at jeg er næsten igennem med denne løsning, hvor alt står inden for while løkken (og $nr hedder $afsSortNr):

$array = array($afsSortNr);
foreach ( $array as $key => $value )
{                                        $valueNed =    $value + 1;                            $ankerNed = $valueNed;                                echo "<a href='#$ankerNed'><img width='17' src='../graphics/pil-ned.png' border='0' alt='Til næste afsnit'></a>";       
                                        $valueOp = $value -1;                                 $ankerOp = $valueOp;                                 echo "<a href='#$ankerOp'><img width='17' src='../graphics/pil-op.png' border='0' alt='Til forrige afsnit'></a>";
    }

Jeg kan så bare ikke rigtig gøre noget ved sidste afsnits pil ned, som ikke bør være der - og løsningen forudsætter alle afsnits sorterings nr. er fortløbende (og begynder med 1).
Avatar billede erikjacobsen Ekspert
04. december 2005 - 21:58 #12
Jeg kan heller ikke se hvad du skal gøre i din while-løkke, der læser fra tabellen, ud over at registrere ting i arrayet.

En foreach er go' hvis man skal gøre det samme ved hvert element, men det skal du ikke, da sidste og måske første gang skal være anderledes. Det klarer du nemmest med en for-løkke, hvor du kan teste på løbevariablen.
Avatar billede zac Nybegynder
05. december 2005 - 21:47 #13
Er kommet lidt videre, måske...
Det hele inden for while løkken:

$array = array($afsSortNr);
$largest = max($array); // giver 4
$smallest = min($array); // giver 1

foreach ( $array as $key => $value )
//eller: while (list($key,$value) = each($array))
{
  $valueNed =    $value + 1;
  $ankerNed = $valueNed;        // <a href='#$ankerNed'>
  if ($ankerNed <= 4)
  // Der er 4 afsnit, jf. $largest - VIRKER, så vises ingen pil-ned ud for sidste afsnit!
  // Men virker IKKE med $largest, så vises slet ingen pil-ned
      {                                                                               
        echo "<a href='#$ankerNed'><img width='17' src='../graphics/pil-ned.png' border='0' alt='Til næste afsnit'></a>";       
            }
  $valueOp =  $value -1;
  $ankerOp = $valueOp;     //<a href='#$ankerOp'>
  echo "<a href='#$ankerOp'><img width='17' src='../graphics/pil-op.png' border='0' alt='Til forrige afsnit'></a>";               
}

Hvorfor den forskel på om der indsættes 4 eller $largest?
Det er ellers tæt på nu, måske...
Avatar billede erikjacobsen Ekspert
06. december 2005 - 08:32 #14
Du skal ikke spilde tiden med foreach. Du skal bruge en almindelig for-løkke.
Avatar billede zac Nybegynder
06. december 2005 - 17:01 #15
Men det kan jeg ikke (finde ud af?):
Jeg er inden for en while løkke med $afsSortNr, så enhver for-løkke, fx med 4 gennemløb, giver 4 resultater for hvert gennemløb af $afsSortNr fra while-løkken (også selv om $afsSortNr=Array(); defineres før while).
Nå, jeg opgiver...
Avatar billede erikjacobsen Ekspert
06. december 2005 - 18:40 #16
Hvorfor dog. Du har ikke forklaret så godt hvad du vil, men mon det bare er at erstatte din foreach med en for. Inde i whileløkken skal du ikke lave mere end der er, sådan cirka i hvert fald.
Avatar billede zac Nybegynder
06. december 2005 - 22:55 #17
Ok, her er, hvad jeg prøver nu:
(jeg tror nok, det her angivne er korrekt, men svært at holde styr på alle ændringerne!)

$result1 = (select fra tb artikler)
while ($row1 = mysql_fetch_array($result1))

  bruger variable fra artikler...
  A: $afsSortNr = array();
  $result2 = (select fra tb afsnit where afsnit.artikelId = artikler.artikelId)
  while ($row2 = mysql_fetch_array($result2))
  {
      bruger variable fra afsnit, bl.a.
      $afsSortNr
          HER: gøre noget ved $afsSortNr. så jeg får nr. på billeder som links/ pil-ned og pil-op til næste afsnit(s ankre)
          Vil ikke have pil ned ved sidste afsnit - der skal derimod være pil-op ved første afsnit.
          Noget af det, jeg har prøvet - med $afsSortNr som henholdsvis 1,2,3,4:

          A. som vist her med array() uden for while:
          print_r($array) giver rigtig nok 1 ved 1. afsnit, 2 ved 2. afsnit, osv.
          Antyder nok, at det er rette vej, men hvordan få fat i keys og values?
          Og hvordan få en grænse på en $i til en for-løkke?
            $largest = max($afsSortNr); // giver ingenting
            $smallest = min($afsSortNr); // giver ingenting           
            $count = count($afsSortNr); // giver 0 ud for alle 4 afsnit             
           
            Ideelt skulle $afsSortNr kunne springe i $value, og $key ikke nødvendigvis begynde med [0].
           
            $array[] = $afsSortNr; skulle kunne give keys, men hvordan/ hvordan få fat i dem?       
          Og selv, hvis jeg får noget à la: for ($i = 1; $i < $count; $i++)
          - hvordan så få fat i $value?       
                 
          B. hvis array def. flyttes indenfor, fås Array ( [0] => 1 ), Array ( [0] => 2 )...=>3, =>4).
          Og stadig med array() indenfor:
            $largest = max($afsSortNr); // giver 1 ved 1. afsnit, 2. ved 2., 3. ved 3., 4 ved 4. afsnit
            (Brug af $largest giver break: for ($i = 1; $i < $largest; $i++) virker ikke, men den varierer jo også)
            $smallest = min($afsSortNr); // giver som $largest 1 ved 1. afsnit, 2. ved 2. osv.           
            $count = count($afsSortNr); // giver 1, dvs. åbenbart 1 for hvert gennemløb af while, 4 gange ialt - echo $count giver '1' ud for hvert afsnit.
            Forstår ikke, hvorfor max() kan tælle op til 4 i 4. gennemløb, mens count() ikke kan tælle til mere end 1!?           
            Men i alle tilfælde: Jeg kan heller ikke her få $count (eller $largest) til at begrænse en for-løkkes $i++
         
          Som nævnt før har jeg en næsten-løsning à la B/ array() indenfor while:
          1) mangler at få fjernet pilen nedad ud for sidste afsnit, når der ikke er en if-sætning inden i foreach:
      $array = array($afsSortNr);
      foreach ( $array as $key => $value )
        {
            $valueNed =    $value + 1;
            $ankerNed = $valueNed;        //<a href='#$ankerNed'>                                                                               
            echo "<a href='#$ankerNed'><img width='17' src='../graphics/pil-ned.png' border='0' alt='Til næste afsnit'></a>";       
            $valueOp = $value -1;
            $ankerOp = $valueOp;     //<a href='#$ankerOp'>
            echo "<a href='#$ankerOp'><img width='17' src='../graphics/pil-op.png' border='0' alt='Til afsnittet før'></a>";       
        }           
         
          2) mangler at få den manuelt indsatte stopklods '4' erstattet med $var.
      $array = array($afsSortNr);
      foreach ( $array as $key => $value )
        {
            $valueNed =    $value + 1;
            $ankerNed = $valueNed;        //<a href='#$ankerNed'>
            if ($ankerNed <= 4) // her skulle der være en $var i.s.f. '4'
              {                                                                               
                  echo "<a href='#$ankerNed'><img width='17' src='../graphics/pil-ned.png' border='0' alt='Til næste afsnit'></a>";       
              }
            $valueOp = $value -1;
            $ankerOp = $valueOp;     //<a href='#$ankerOp'>
            echo "<a href='#$ankerOp'><img width='17' src='../graphics/pil-op.png' border='0' alt='Til afsnittet før'></a>";               
        }         
          ................
          bruger flere variable fra afsnit
  }
  bruger flere variable fra artikler
}
Så der er måske ingen løsning med denne grundopsætning?
Avatar billede erikjacobsen Ekspert
06. december 2005 - 23:02 #18
Det ved jeg ikke, og det har jeg heller ikke lyst til at finde ud af.

Prop dine tingester ind i dit array, på den simplest tænkelige måde.
Sorter dit array (hvis ikke allerede sorteret fra databasen)
Brug en    for ($i=0;$i<count($ditarray);$i++)
Og find ud om det er sidste element med    if ($i==count($ditarray)-1) { // sidste element
Avatar billede zac Nybegynder
06. december 2005 - 23:30 #19
Jeg kan ikke nok til at proppe ind og tage ud af det array - jeg kan godt lave en $i..., men på hvad? Kan ikke få $value ud...

Har i mellemtiden lavet denne lille omvej, som tillæg under while'en:
            $result5 = mysql_query( "SELECT MAX(afsSortNr) AS maxNum, MIN(afsSortNr) AS minNum
            FROM
            afsnit
            WHERE $artikelId = '$artikelId'
            ");           
               
            while ($row5 = mysql_fetch_array($result5))
            {           
                    $maxNum                  = $row5["maxNum"];
                    $minNum                  = $row5["minNum"];                   
            }

så virker det med $maxNum i stedet for '4' ovenfor - jeg hiver en var for antallet ind, som jeg ikke kan (finde ud af at) fra den opr. while-løkke alene.

Men tak fordi du pressede mig lidt til at gå længere med arrays end jeg ellers havde tænkt mig - jeg har stadig ret meget at lære, men har lært noget undervejs!
Det næste er at få $key og $value ud.
Avatar billede zac Nybegynder
07. december 2005 - 16:06 #20
Takker for deltagelsen og lukker her.
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