Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tablica trójwymiarowa plus sortowanie?
Forum PHP.pl > Forum > Przedszkole
Fonev
Witam ponownie,

Chciałbym w pętli uzupełnić tablicę trójwymiarowa:

waga1 | wartosc1 | wsp1
waga2 | wartosc2 | wasp2
.
.
.
itp aż do n

kod:
  1. for( $x = 1; $x <= $ilosc; $x++ )
  2. $tablica[$x][$x][$x]={$wagi[$x],$wartosc[$x],$wsp[$x]};


na jakiejś stronie znalazłem taki sposób ale nie działa...

Od razu zadam pytanie też czy da się taką tablicę posortować względem wsp malejąco.?
Geston
Cytat(Fonev @ 4.02.2014, 21:08:19 ) *
Witam ponownie,

Chciałbym w pętli uzupełnić tablicę trójwymiarowa:

waga1 | wartosc1 | wsp1
waga2 | wartosc2 | wasp2
.
.
.
itp aż do n


Trójwymiarową czy dwuwymiarową po 3 pola w każdym wierszu?
Fonev
po trzy pola tak jak napisałem

waga, wartosc, wsp

mam je w trzech osobnych tablicach chce miec w jednej tablicy i posortowac względem wsp malejąco.
Geston
Albo nie rozumiem i ktoś inny musi Ci pomóc albo używasz błędnych pojęć przez co się nie rozumiemy smile.gif
Jeżeli masz je w trzech osobnych tablicach, pokaż te tablice, chyba że to co w pierwszym poście wrzuciłeś to nie jedna tablica z trzema kolumanmi a trzy tablice po jednej kolumnie każda i chcesz je złączyć w jedną tablicę z trzema kolumnami, to pojęcie "trójwymiarowa" jest tutaj błędne.
Fonev
mam trzy tablice
1: tak ja uzupelniam

  1. for( $x = 1; $x <= $ilosc; $x++ )
  2. $wagi[$x] = ($_POST['waga_'.$x]);


2: tak ja uzupelniam

  1. for( $x = 1; $x <= $ilosc; $x++ )
  2. $wartosc[$x] = ($_POST['wartosc_'.$x]);


3: tak ja uzupełniam:

  1. for( $x = 1; $x <= $ilosc; $x++ )
  2. $wsp[$x] = round($wartosc[$x]/$wagi[$x], 2);



pokazałem sobie to w tabeli w formie:

waga1 | wartosc1 | wsp1 |
waga2 | wartosc2 | wsp2 |
.
.
.
itp aż do ilosc

teraz chce posortowac te rekordy względem wsp malejąco. Dlatego chyba najłatwiej by było w tablicy trójwymiarowej.

Owszem mógłbym tak jak poniżej w c++ (sortowanie bąbelkowe)


for (int i=1;i<10;i++)
{

if (tablica[i]<tablica[i+1])
{
temp1 = tablica[i];
temp2 = wartosc[i];
temp3 = waga[i];

tablica[i] = tablica[i+1];
wartosc[i] = wartosc[i+1];
waga[i] = waga[i+1];

tablica[i+1] = temp1;
wartosc[i+1] = temp2;
waga[i+1] = temp3;

temp1=0;
temp2=0;
temp3=0;
}

}


ale czy nie ma innego sposobu?
ctom
Kod
$dane = array();

for( $x = 0; $x < $ilosc; $x++)
{
   $dane[] = array(
    'waga'  => $_POST['waga_'.$x],
    'wartosc' =>$_POST['wartosc_'.$x],
    'wsp' =>  round($wartosc[$x]/$wagi[$x], 2)
    
);
}



a dalej poczytaj to http://www.php.net/manual/pl/function.array-multisort.php i dasz sobie radę
Fonev
Dzięki od razu konkret:

  1. for ($i = 1; $i < $ilosc; $i++)
  2. for ($j = $ilosc - 1; $j >= $i; $j--)
  3. if ($wsp[$j - 1] > $wsp[$j])
  4. {
  5.  
  6. list($wsp[$j - 1], $wsp[$j]) = array($wsp[$j], $wsp[$j - 1]);
  7. list($wagi[$j - 1], $wagi[$j]) = array($wagi[$j], $wagi[$j - 1]);
  8. list($wartos[$j - 1], $wartos[$j]) = array($wartos[$j], $wartos[$j - 1]);
  9. }


Takie bąbelkowe jeszcze stworzyłem ale poczytam to co mi wysłałeś bo sa na to pewnie jakieś krótsze sposoby.
Geston
Najprościej do tego co wrzucił ctom dodać insert i ładować kolejno rekordy do bazy danych, wtedy nie potrzebujesz algorytmów sortowania a jedynie zapytanie do bazy danych odpowiednio sformułowane i jedną formułą dostajesz swoją tablicę posortowaną jak tylko sobie wymarzysz.
Fonev
Napisałem poniższy kod i wszystko działa jak chciałem tylko że: pomiędzy dwoma tabelami wywala mi komunikat , że nie ma klucza 0:

Notice: Undefined offset: 0 in C:\xampp\htdocs\phpp\trzeci.php on line 38

Jak mogę się tego pozbyć bo kombinuje z tą iteracją i warunkami else ale chyba nie rozumiem o co chodzi.



  1. <HTML>
  2. <HEAD>
  3. <TITLE>Problem Plecakowy - krok 3</TITLE>
  4. </HEAD>
  5. <BODY>
  6. <?php
  7. $waga=stripslashes($_POST['waga']);
  8. $ilosc=stripslashes($_POST['liczba']);
  9. echo '<TABLE border="1">';
  10. echo '<TR><TD>ILOSC ='.$ilosc.'</TD>';
  11. echo '<TD>WAGA ='.$waga.'.</TD></TR></TABLE><BR><BR><HR>';
  12.  
  13.  
  14. for( $x = 1; $x <= $ilosc; $x++ )
  15. $wagi[$x] = ($_POST['waga_'.$x]);
  16.  
  17. for( $x = 1; $x <= $ilosc; $x++ )
  18. $wartosc[$x] = ($_POST['wartosc_'.$x]);
  19.  
  20. for( $x = 1; $x <= $ilosc; $x++ )
  21. $wsp[$x] = round($wartosc[$x]/$wagi[$x], 2);
  22.  
  23.  
  24. //rysowanie tabeli
  25. echo '<TABLE border=1>';
  26. for( $x = 1; $x <= $ilosc; $x++ )
  27. {
  28. echo '<TR><TD>'.$x.'</TD><TD><INPUT type="text" name="wartosc" value="'.$wartosc[$x].'"/></TD>';
  29. echo '<TD><INPUT type="text" name="waga" value="'.$wagi[$x].'"/></TD>';
  30. echo '<TD><INPUT type="text" name="wsp" value="'.$wsp[$x].'"/></TD></TR>';
  31. }
  32. echo '</Table>';
  33. echo '<BR><HR><BR>';
  34. //sortowanie
  35. for ($i = 1; $i < $ilosc; $i++)
  36. for ($j = $ilosc; $j >= $i; $j--)
  37. {
  38. if($wsp[$j-1] > $wsp[$j])
  39. {
  40.  
  41. list($wsp[$j - 1], $wsp[$j]) = array($wsp[$j], $wsp[$j - 1]);
  42. list($wagi[$j - 1], $wagi[$j]) = array($wagi[$j], $wagi[$j - 1]);
  43. list($wartosc[$j - 1], $wartosc[$j]) = array($wartosc[$j], $wartosc[$j - 1]);
  44. }
  45. }
  46.  
  47. echo '<TABLE border=1>';
  48. for( $x = 1; $x <= $ilosc; $x++ )
  49. {
  50. echo '<TR><TD>'.$x.'</TD><TD><INPUT type="text" name="wartosc" value="'.$wartosc[$x].'"/></TD>';
  51. echo '<TD><INPUT type="text" name="waga" value="'.$wagi[$x].'"/></TD>';
  52. echo '<TD><INPUT type="text" name="wsp" value="'.$wsp[$x].'"/></TD></TR>';
  53. }
  54. echo '</Table>';
  55.  
  56.  
  57. ?>
  58. </BODY>
  59. </HTML>
vonski
Tablica $wsp jest numerowana od klucza "1" w górę, według tego kodu (20 i 21 linijka):

  1. for( $x = 1; $x <= $ilosc; $x++ )
  2. $wsp[$x] = round($wartosc[$x]/$wagi[$x], 2);


W 38-ej linijce masz:

  1. if($wsp[$j-1] > $wsp[$j])


Więc w ostatnim etapie iteracji $j musi dostawać wartość 1, przez co 1 - 1 = 0 => komunikat o nieistniejącym indeksie. I to by się w sumie zgadzało, bo w 36-tej linicje jest taki for:

  1. for ($j = $ilosc; $j >= $i; $j--)


A linijkę wyżej
  1. for ($i = 1; $i < $ilosc; $i++)


Więc obstawiam, że jak w 36-tej linijce zamienisz ">=" na ">" powinno być ok:

  1. for ($j = $ilosc; $j > $i; $j--)
Fonev
Zgadza się dzięki, już się nie pojawia ten komunikat.
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.