Avatar billede encorez Nybegynder
05. august 2009 - 21:13 Der er 11 kommentarer og
2 løsninger

Skift pointer i et array

Hej

Jeg skal gennem løbe et array. Men foruden at bruge den key jeg står på nu, så skal jeg også vide hvad den næste er. Hvor klarer jeg den?

Noget som sådan...

foreach ($query as $key => $value) {
  echo "nuværende key: $key";
  echo "den næste key er: ...hvordan finder jeg den?";
}
Avatar billede encorez Nybegynder
05. august 2009 - 22:00 #1
jeg prøver at kombinere next() og current() og key(), men får intet brugbart
Avatar billede repox Seniormester
05. august 2009 - 22:35 #2
Det forekommer mig en smule ulogisk at du kan have det behov.
Prøv at fortælle hvad dit mål er, så kunne det være vi kunne komme på en løsning som måske kunne passe til dit behov.
Avatar billede jenz3n Nybegynder
06. august 2009 - 02:10 #3
foreach ($query as $key => $value) {
  echo "nuværende key: $key";
  echo "den næste key er: " . key(next($transport));
  prev($transport);
}
Avatar billede jenz3n Nybegynder
06. august 2009 - 02:15 #4
En helt anden måde at gøre det på er at cache indholdet og så genbruge det i næste loop:

foreach ($query as $key => $value) {
  echo "nuværende key: $previousKey";
  echo "den næste key: $key";
  $previousKey = $key;
  $previousValue = $value;
}

På den måde vil din foreach hele tiden være "et skridt foran".
Avatar billede encorez Nybegynder
06. august 2009 - 08:01 #5
repox-> brugere skal kunne skifter menuer op og ned så det passer til dem. For at sende et punkter ned i rækkefølgen vil jeg sende det  valgte punkt med samt jeg skal sende det næste med, da det er de to der skal ændres på. Den ene skal en placering ned, den anden en placering op.

jenz3n -> Jeg synes jeg har forsøgt det du skriver key(next($transport)). Bortset fra det i det lille eksempel bør være key(next($query)) ikke sat.

Det kan være at de alternative måde kan gøre det... Det vil jeg forsøge hvis alt andet svigter.
Avatar billede repox Seniormester
06. august 2009 - 08:30 #6
Ikke forstået?
Hvad betyder 'brugere skal kunne skifte menuer op og ned'? Har du nogle grafiske eksempler på det du forsøger at opnå?
Avatar billede encorez Nybegynder
06. august 2009 - 08:34 #7
Det kan være menuer, men i dette tilfælde bare forestil dig en række emner i en punktopstilling, de står dermed lodret under hinanden. Ud for hver punkt er der en pil der peger op og en der peger ned. Fordi brugeren skal selv kunne flytte punkterne op eller ned så rækkefølgen ændres som de vil have det.

Håber det gav et bedre visuelt billede.
Avatar billede repox Seniormester
06. august 2009 - 08:54 #8
Og grunden til at du skal bruge det næste indeks er at du vil undgå at du har en 'pil ned' ved det sidste punkt eller hvad?
Avatar billede encorez Nybegynder
06. august 2009 - 09:14 #9
Ikke bare det. Hvert punkt har et ID som er Key i mit array. Og value til hver key er placeringen som punkterne skal placeres efter.

Når et punkt skal skifte placering, så er det ikke bare det valgte punkt hvor placeres skal ændres, men også punktet lige neden under. Når brugeren trykker på "pil ned" ud for et punkt ser mit link sådan ud
<a href="?current_bullet=<?=$key?>&next_bullet=<?=$skal_findes?>">En pil</a>

Når brugeren trykket på linket/pilen, så sørger jeg for valuen på current_bullet lægges 1 til, mens jeg trækker 1 fra value på next_bullet. Og derved skifter de placering i mit array
Avatar billede repox Seniormester
06. august 2009 - 09:35 #10
Det skal du løse i den kode der sørger for at flytte tingene.

Jeg har en tabel med menupunkter som sorteres efter et felt kaldet 'sort'
Eksempel på min tabel:
[code]
+--------+--------------+------+
| pageId | pName        | sort |
+--------+--------------+------+
|      1 | Forside      |    0 |
|      2 | Portfolio    |    1 |
|      3 | Blog        |    2 |
|      4 | Kontakt mig  |    3 |
|      5 | Projekter    |    4 |
+--------+--------------+------+
[/code]

Super simpelt setup.

Så ville jeg f.eks. gøre således:
<a href="?current_bullet=<?=$key?>&move=up">En pil</a>

og så have en funktion til formålet:

<?php

    function moveMenuPoint($sortKey, $direction)
    {
    if($direction == "up")
        $newSort = $sort - 1;
    elseif($direction == "down")
        $newSort = $sort + 1;

    $sql = "SELECT pageId, sort FROM pages ORDER BY sort ASC";
    $res = mysql_query($sql);
    while($row = mysql_fetch_assoc($res))
        $pages[$row["sort"]] = $row["pageId"];

    $temp[$sort] = $pages[$sort];
    $temp[$newSort] = $pages[$newSort];
       
    $pages[$sort] = $temp[$newSort];
    $pages[$newSort] = $temp[$sort];

    foreach($pages as $sortKey => $pageId)
    {
        $sql = "UPDATE pages SET sort=".$sortKey." WHERE pageId=".$pageId;
        mysql_query($sql);
    }


    }

?>

Altså, lidt rough skrevet, men idéen er der og så slipper du for at forsøge at gøre ting som ikke giver mening.
Avatar billede jenz3n Nybegynder
06. august 2009 - 11:46 #11
Jeg vil give Repox ret i at det er en langt bedre måde at gøre det på, men jeg mener det kan gøres endnu mere elegant ved at "swappe" eller bytte punkterne i stedet for at formode at rækkefølgen i sort er korrekte:

<a href="?move=<?=$pageId?>&way=1">En pil op</a>

if (isset($_GET['move']) && is_numeric($_GET['move'])) {
    $page = mysql_query('SELECT `id`,`sort` FROM `pages` WHERE `id` = ' . $_GET['move']);
    if (mysql_num_rows($page ) == 1) {
        $page = mysql_fetch_array($page);
        $way = $_GET['way'] === '1' ? 1 : 0;
        switch ($way) {
            case 1:
                $swapPage = mysql_query('SELECT `id`,`sort` FROM `pages` WHERE `sort` < ' . $page['sort'] . ' ORDER BY `order` DESC LIMIT 1');
                break;
            case 0:
                $swapPage = mysql_query('SELECT `id`,`sort` FROM `pages` WHERE `sort` > ' . $page['sort'] . ' ORDER BY `order` LIMIT 1');
                break;
            default:
                break;
        }
        if (mysql_num_rows($swapPage) == 1) {
            $swapPage = mysql_fetch_array($swapPage);
            mysql_query('UPDATE `pages` SET `sort` = ' . $swapPage['sort'] . ' WHERE `id` = ' . $page['id']);
            mysql_query('UPDATE `pages` SET `sort` = ' . $page['sort'] . ' WHERE `id` = ' . $swapPage['id']);
        }
    }
}

Husk at sikre $_GET['move'] mod SQL injection, jeg har udeladt det fordi eksemplet kommer fra en side hvor jeg bruge er framework som håndterer SQL quries.
Avatar billede encorez Nybegynder
06. august 2009 - 17:39 #12
Ja, jeg vil istedet forsøge gøre det i en funktion. Men jeg vil nok i funktionen gøre som jenz3n og blot swappe de to værdier.

Repox - læg også et svar for din hjælp
Avatar billede repox Seniormester
06. august 2009 - 22:31 #13
Det fik du 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