Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Konwersja tablicy na inną tablicę
Forum PHP.pl > Forum > PHP
pkr
Mam problem z konwersją tablicy na inną tablicę.

Dane wejściowe:

  1. (
  2. [0] => Array
  3. (
  4. [id_field] => 26
  5. [id_table] => 29
  6. [id_column] => 10
  7. [value] => 1%
  8. [id_row] => 2
  9. [colname] => Zapotrzebowanie dzienne
  10. )
  11.  
  12. [1] => Array
  13. (
  14. [id_field] => 25
  15. [id_table] => 29
  16. [id_column] => 8
  17. [value] => tłuszcz
  18. [id_row] => 2
  19. [colname] => Składnik
  20. )
  21.  
  22. [2] => Array
  23. (
  24. [id_field] => 28
  25. [id_table] => 29
  26. [id_column] => 10
  27. [value] => value
  28. [id_row] => 3
  29. [colname] => Zapotrzebowanie dzienne
  30. )
  31.  
  32. [3] => Array
  33. (
  34. [id_field] => 27
  35. [id_table] => 29
  36. [id_column] => 8
  37. [value] => example
  38. [id_row] => 3
  39. [colname] => Składnik
  40. )
  41.  
  42. [4] => Array
  43. (
  44. [id_field] => 31
  45. [id_table] => 29
  46. [id_column] => 11
  47. [value] => extra value
  48. [id_row] => 4
  49. [colname] => Kolejna kolumna
  50. )
  51.  
  52. [5] => Array
  53. (
  54. [id_field] => 30
  55. [id_table] => 29
  56. [id_column] => 10
  57. [value] => 10%
  58. [id_row] => 4
  59. [colname] => Zapotrzebowanie dzienne
  60. )
  61.  
  62. [6] => Array
  63. (
  64. [id_field] => 29
  65. [id_table] => 29
  66. [id_column] => 8
  67. [value] => węglowodany
  68. [id_row] => 4
  69. [colname] => Składnik
  70. )
  71.  
  72. )


Wyjście powinno wyglądać tak:

  1. (
  2. [0] => Array
  3. (
  4. [0] => empty field
  5. [1] => 1%
  6. [2] => tłuszcz
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [0] => empty field
  12. [1] => value
  13. [2] => example
  14. )
  15.  
  16. [2] => Array
  17. (
  18. [0] => extra value
  19. [1] => 10%
  20. [2] => węglowodany
  21. )
  22.  
  23. )


Czyli: W pierwszej tabeli mamy każde pole z osobna, ale jest tam id kolumny i wiersza. Muszę zamienić to na tablicę w postaci jak wyżej + jeśli jakieś pole nie istnieje to w wyjściowej tablicy ma mieć wartość "puste pole".

Napisałem kod konwertujący tą tablicę, ale bez wypełnienia pusych pól, nie mam pomysłu jak sobie z tym poradzić.

Oto mój kod:

  1. for($i=0; $i<count($result); $i++) {
  2.  
  3. if(!is_array($rows[$i2])) $rows[$i2]=array();
  4.  
  5. if($result[$i]['id_row']==$result[$i-1]['id_row'] OR $i==0) {
  6. array_push($rows[$i2], $result[$i]['value']);
  7. } else {
  8.  
  9. $i2++;
  10. $rows[$i2]=array();
  11.  
  12. array_push($rows[$i2], $result[$i]['value']);
  13. }
  14.  
  15. }


Muszę go rozszerzyć o uzupełnianie pustych pól - pomożecie smile.gif ?

Z góry dzięki
tolomei
Witaj.

Mógłbyś zserializować pierwszą tablicę i wkleić tutaj ?

Pozdro.
pkr
Tablica po serializacji:

  1. a:6:{i:0;a:6:{s:8:"id_field";s:2:"40";s:8:"id_table";s:2:"29";s:9:"id_column";s:2:"11";s:5:"value";s:5:"value";s:6:"id_row";s:1:"1";s:7:"colname";s:15:"Kolejna kolumna";}i:1;a:6:{s:8:"id_field";s:2:"39";s:8:"id_table";s:2:"29";s:9:"id_column";s:2:"10";s:5:"value";s:3:"12%";s:6:"id_row";s:1:"1";s:7:"colname";s:23:"Zapotrzebowanie dzienne";}i:2;a:6:{s:8:"id_field";s:2:"38";s:8:"id_table";s:2:"29";s:9:"id_column";s:1:"8";s:5:"value";s:7:"example";s:6:"id_row";s:1:"1";s:7:"colname";s:9:"Składnik";}i:3;a:6:{s:8:"id_field";s:2:"43";s:8:"id_table";s:2:"29";s:9:"id_column";s:2:"11";s:5:"value";s:2:"23";s:6:"id_row";s:1:"2";s:7:"colname";s:15:"Kolejna kolumna";}i:4;a:6:{s:8:"id_field";s:2:"42";s:8:"id_table";s:2:"29";s:9:"id_column";s:2:"10";s:5:"value";s:2:"5%";s:6:"id_row";s:1:"2";s:7:"colname";s:23:"Zapotrzebowanie dzienne";}i:5;a:6:{s:8:"id_field";s:2:"41";s:8:"id_table";s:2:"29";s:9:"id_column";s:1:"8";s:5:"value";s:5:"nazwa";s:6:"id_row";s:1:"2";s:7:"colname";s:9:"Składnik";}}
tolomei
Podałeś mi inną tablicę niż w pierwszym poście, ale powinno działać dla każdego przypadku.

  1. // $input = twoja tablica
  2.  
  3. $output = array();
  4. foreach($input as $row) {
  5. if(!isset($output[$row['id_row']][0])) {
  6. $output[$row['id_row']][0] = 'empty field';
  7. }
  8. switch($row['id_column']) {
  9. case 1:
  10. $output[$row['id_row']][0] = $row['value'];
  11. break;
  12. case 10:
  13. $output[$row['id_row']][1] = $row['value'];
  14. break;
  15. case 8:
  16. $output[$row['id_row']][2] = $row['value'];
  17. break;
  18. }
  19. }
  20. $output = array_values($output);
  21.  
  22. echo '<pre>';
  23. print_r($input);
  24. print_r($output);
  25. echo '</pre>';


Wyjście:
  1. (
  2. [0] => Array
  3. (
  4. [id_field] => 40
  5. [id_table] => 29
  6. [id_column] => 11
  7. [value] => value
  8. [id_row] => 1
  9. [colname] => Kolejna kolumna
  10. )
  11.  
  12. [1] => Array
  13. (
  14. [id_field] => 39
  15. [id_table] => 29
  16. [id_column] => 10
  17. [value] => 12%
  18. [id_row] => 1
  19. [colname] => Zapotrzebowanie dzienne
  20. )
  21.  
  22. [2] => Array
  23. (
  24. [id_field] => 38
  25. [id_table] => 29
  26. [id_column] => 8
  27. [value] => example
  28. [id_row] => 1
  29. [colname] => Skł‚adnik
  30. )
  31.  
  32. [3] => Array
  33. (
  34. [id_field] => 43
  35. [id_table] => 29
  36. [id_column] => 11
  37. [value] => 23
  38. [id_row] => 2
  39. [colname] => Kolejna kolumna
  40. )
  41.  
  42. [4] => Array
  43. (
  44. [id_field] => 42
  45. [id_table] => 29
  46. [id_column] => 10
  47. [value] => 5%
  48. [id_row] => 2
  49. [colname] => Zapotrzebowanie dzienne
  50. )
  51.  
  52. [5] => Array
  53. (
  54. [id_field] => 41
  55. [id_table] => 29
  56. [id_column] => 8
  57. [value] => nazwa
  58. [id_row] => 2
  59. [colname] => Skł‚adnik
  60. )
  61.  
  62. )
  63.  
  64. (
  65. [0] => Array
  66. (
  67. [0] => empty field
  68. [1] => 12%
  69. [2] => example
  70. )
  71.  
  72. [1] => Array
  73. (
  74. [0] => empty field
  75. [1] => 5%
  76. [2] => nazwa
  77. )
  78.  
  79. )


Pozdrawiam.
pkr
Hmmm podane przez ciebie rozwiązanie chyba nie działa dobrze, zobacz że na wejsciu masz 6 pól. Na wyjściu dwa z nich są oznaczone jako puste, czyli coś nie gra. Puste pole jest wtedy kiedy w ogóle nie ma go w wejściu. Wtedy na wyjściu powinno być stworzone pole w odpowiednim miejsciu z tekstem "emptyfield".
tolomei
O sorry pkr.
Chochlik mi jedynkę zjadł w 9. linii wink.gif

  1. // $input = twoja tablica
  2.  
  3. $output = array();
  4. foreach($input as $row) {
  5. if(!isset($output[$row['id_row']][0])) {
  6. $output[$row['id_row']][0] = 'empty field';
  7. }
  8. switch($row['id_column']) {
  9. case 11:
  10. $output[$row['id_row']][0] = $row['value'];
  11. break;
  12. case 10:
  13. $output[$row['id_row']][1] = $row['value'];
  14. break;
  15. case 8:
  16. $output[$row['id_row']][2] = $row['value'];
  17. break;
  18. }
  19. }
  20. $output = array_values($output);
  21.  
  22. echo '<pre>';
  23. print_r($input);
  24. print_r($output);
  25. echo '</pre>';


Pozdrawiam.
pkr
Hmm kurcze tak bez patrzenia przekleiłem twój kod. Generalnie liczba kolumn nie jest stała, nie mogę założyć jakie będą ID. także to rozwiązanie trzeba jeszcze poprawić. ale i tak dzięki za pomoc smile.gif cały bajer polegan tym, że tu wszystko jest dynamiczne, liczba kolumn, liczba wersów. Wiem tylko jakie mają ID, i na tej podstawie muszą zbudować całą arraykę (dane wejściowe podane w poście są jedynie przykładem). Kod podany przeze mnie działa dobrze, tylko właśnie nie uwzględnia emptyfields - może jakby komuś udało się to dopracować?
tolomei
Twój kod nie jest pełny.

- która zmienna oznacza dane wejściowe?
- która zmienna oznacza dane wyjściowe?
- skąd się bierze zmienna $i2 i jaką ma wartość początkową?
- jaka jest wartość początkowa zmiennej $result?
pkr
już odpowiadam:

- dane wejściowe to tablica $result
- dane wyjścioe to tablica $rows
- $i2 służy do oznaczania kolejnych wersów w tablicy wyjścia $rows, a jej wartość początkowa to 0
- wartością początkowa zmiennej $result jest tablica wg. wzoru w pierwszym poście (dane pochodzą z bazy mysql)

no i ten kod poprawnie zamienia takie dane, ale brakuje mu tylko obsługi emptyfields :/
tolomei
Nie przerobię Twojego skryptu.
Jeśli chcesz napiszę Ci taki od nowa na dowolną liczbę kolumn.

Możemy zrobić tak, że index w wewnętrznej tablicy będzie odpowiadał numerowi kolumny:

  1. (
  2. [0] => Array
  3. (
  4. [8] => tłuszcz
  5. [10] => 1%
  6. [11] => empty field
  7. [15] => empty field
  8. [19] => 10,2 mg
  9. )
  10.  
  11. )


Pasuje ?

Oto i on:

  1. // $input = twoja tablica
  2.  
  3. $output = array();
  4. $categories = array();
  5. foreach($input as $row) {
  6. if(!in_array($row['id_column'], $categories)) {
  7. $categories[$row['id_column']] = 'empty field';
  8. }
  9. }
  10. ksort($categories);
  11. foreach($input as $row) {
  12. if(!isset($output[$row['id_row']])) {
  13. $output[$row['id_row']] = $categories;
  14. }
  15. $output[$row['id_row']][$row['id_column']] = $row['value'];
  16. }
  17. $output = array_values($output);
  18.  
  19. echo '<pre>';
  20. print_r($input);
  21. print_r($output);
  22. echo '</pre>';


Pozdrawiam.
pkr
Twoje rozwiązanie jest idealne smile.gif Bardzo dziękuje za pomoc i poświęcony czas, pozdrawiam smile.gif
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.