Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] przesuniecie elementu tablicy wyzej/nizej
Forum PHP.pl > Forum > Przedszkole
gox
Witam, mam tablice z 3 elementami, chcialbym np. aby element bedacy drugi w kolejnosci przemiescil sie na pierwsa pozycje... albo na ostatnia, chodzi mi o move up move down... jak to zrobic w prosty sposob bez zbednej rzezby. z gory tnx za pomoc.
golaod
Prosty sposob to sie nazywa zmienna $tmp;
$tmp = $tablica[1];
$tablica[1] = $tablica[0]
$tablica[0] = $tmp;
gox
yyy nie jarze... powiedzmy ze mam 500 elementow w tablicy i chce 350ty przesunac na 349 a ten co byl na 349 wskakuje na 350... tongue.gif
gox
cos z array_slice powinno byc czyz nie?
qrees
$tmp = $tablica[350];
$tablica[350] = $tablica[349]
$tablica[349] = $tmp;
drPayton
A co ma array_slice do tego? blinksmiley.gif

W Twoim przykładzie, na podstawie tego co napisał @golaod:
  1. <?php
  2. $tmp = $tablica[350];
  3. $tablica[350] = $tablica[349];
  4. $tablica[349] = $tmp;
  5. ?>
gox
Ok tylko teraz doprecyzowujac....

indeksy tablic sa tekstowe, przesuwanie bedzie nastepowalo tylko i wylacznie o jedno w dol lub do gory, indeksty tablic sa unikalne... jesli zrbobie tak po prosty $tablicap['cos'] = $temp; to mi wskoczy na ostatnie miejsce...
gox
czyzby tylko slicem jednak sie dalo, ze sie tak wyraze wlasnie to ma do tego tongue.gif
drPayton
A to jak ma indexy przemieszczać to inna bajka. Zaraz wkleję swoje wypociny w ten post winksmiley.jpg


  1. <?php
  2. function array_move_index($aArray, $sArrayIndex, $sDirection) {
  3.  
  4. $keys = array_keys($aArray);
  5. $values = array_values($aArray);
  6.  
  7. $searchedIndexPosition = array_search($sArrayIndex, $keys);
  8.  
  9. $valueAtIndexFound = $values[$searchedIndexPosition];
  10.  
  11. /**
  12.  * Move Up
  13.  */
  14. if($sDirection == 'up') {
  15. $mIndexAtPrevPosition = $keys[$searchedIndexPosition-1];
  16. $mValueAtPrevPosition = $values[$searchedIndexPosition-1];
  17.  
  18. $tmp = $keys[$searchedIndexPosition];
  19. $keys[$searchedIndexPosition] = $keys[$searchedIndexPosition-1];
  20. $keys[$searchedIndexPosition-1] = $tmp;
  21.  
  22. $tmp = $values[$searchedIndexPosition];
  23. $values[$searchedIndexPosition] = $values[$searchedIndexPosition-1];
  24. $values[$searchedIndexPosition-1] = $tmp;
  25. } 
  26. /**
  27.  * Move down
  28.  */
  29. else {
  30. $mIndexAtPrevPosition = $keys[$searchedIndexPosition+1];
  31. $mValueAtPrevPosition = $values[$searchedIndexPosition+1];
  32.  
  33. $tmp = $keys[$searchedIndexPosition];
  34. $keys[$searchedIndexPosition] = $keys[$searchedIndexPosition+1];
  35. $keys[$searchedIndexPosition+1] = $tmp;
  36.  
  37. $tmp = $values[$searchedIndexPosition];
  38. $values[$searchedIndexPosition] = $values[$searchedIndexPosition+1];
  39. $values[$searchedIndexPosition+1] = $tmp;
  40. }
  41.  
  42. return array_combine($keys, $values);
  43. }
  44.  
  45.  
  46.  
  47. $oldArray = array(
  48. 'index1' => 'elem1', 
  49. 'index2' => 'elem2', 
  50. 'index3' => 'elem3', 
  51. 'index4' => 'elem4', 
  52. 'index5' => 'elem5', 
  53. 'index6' => 'elem6', 
  54. 'index7' => 'elem7', 
  55. 'index8' => 'elem8'
  56. );
  57.  
  58. $newArray = array_move_index($oldArray, 'index6', 'down');
  59.  
  60.  
  61. echo '<br>Array before movement<br /><pre>';
  62. print_r($oldArray);
  63. echo '</pre><br />';
  64.  
  65.  
  66. echo '<br>Array after movement<br /><pre>';
  67. print_r($newArray);
  68. echo '</pre><br />';
  69. ?>


Brak zabezpieczenia przed próbą przesunięcia w górę elementu z pierwszej pozycji (i analogicznie przesunięcia w dół elementu ostatniego). Zapewne dałoby się dużo prościej, ale to działa ;P
gox
Heh widze ze trafilem na programistyczny dylemat, narazie w gore mam cos takiego:

  1. <?php
  2. $cat_to_move_up = 'Polska';
  3. $i=0;
  4. foreach ($this->db as $cat=>$db) {
  5. if ($cat == $cat_to_move_up) {
  6. $i--;
  7. break;
  8. }
  9. $i++;
  10. }
  11. $tmp[$cat_to_move_up] = $this->db[$cat_to_move_up];
  12. unset($this->db[$cat_to_move_up]);
  13.  
  14. $array_a = array_slice($this->db, 0, $i);
  15. $array_b = array_slice($this->db, $i);
  16. $wynik = array_merge($array_a, $tmp, $array_b);
  17. ?>


Da sie jakos latwiej policzyc pozycje indexu niz tak prostacko foreachem?
drPayton
Przeca napisałem Ci gotową funkcję do tego...

Pozycja szukanego indeksu:
  1. <?php
  2. $keys = array_keys($TablicaWejsciowa);
  3. $searchedIndexPosition = array_search($SzukanyIndex, $keys);
  4. ?>
gox
fajnie, dzieki, niemniej wrzucam tutaj swoj sporo krotszy kod:

  1. <?php
  2. $cat_to_move_up = 'testowanowa';
  3. $how = 'down';
  4.  
  5. $keys = array_keys($this->db);
  6. $pos = array_search($cat_to_move_up, $keys);
  7. if ($pos == 0) die('Nie mozna przesunac pierwszej pozycji w gore.');
  8. $pos--;
  9.  
  10. $tmp[$cat_to_move_up] = $this->db[$cat_to_move_up];
  11. unset($this->db[$cat_to_move_up]);
  12.  
  13. $array_a = array_slice($this->db, 0, $pos);
  14. $array_b = array_slice($this->db, $pos);
  15.  
  16. switch(strtolower(trim($how))) {
  17. case 'up':
  18. $wynik = array_merge($array_a, $tmp, $array_b);
  19. break;
  20. case 'down':
  21. $wynik = array_merge($array_a, $array_b, $tmp);
  22. break;
  23. default:
  24. die('blad');
  25. }
  26. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.