Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Problem z Wyświetleniem zawartości tablicy wielowymiarowej.
Forum PHP.pl > Forum > Przedszkole
Lobek
Witam.

Zwracam się do Was z prośbą o podpowiedź. Poniżej zamieszczam skrypt który
przegląda katalog "Remanent" i wrzuca do tablicy wszystkie nazwy plików
w których są tylko 2 dane oddzielone przecinkiem (kod-ean,ilość)
potem w pętli wrzuca dane z wszystkich plików do tablicy i jako ostatnią wartość dodaje nazwę pliku
bez rozszerzenia

Nie mogę poradzić sobie jak wyświetlić wszystkie dane po kolei w formie (kod,ilość,nazwapliku)



  1. <?php
  2. $tab = array();
  3. if ($dir = @opendir("Remanent")) {
  4. while (false !== ($file = readdir($dir))) {
  5. if ($file != "." && $file != "..") {
  6. if(!is_dir($file)){
  7. $tab[]=$file;
  8. }
  9. }
  10. }
  11. closedir($dir);
  12. }
  13. //print_r($tab);
  14. echo "<p></p>";
  15. foreach ($tab as $filename) {
  16. $handle = fopen("Remanent/$filename", "r");
  17. $data = array();
  18. if ($handle) {
  19. while (!feof($handle)) {
  20. $buffer = fgets($handle, 4096);
  21. $data[]=array_pad(explode(",", $buffer), 3, substr("$filename", -8, -4));
  22. }
  23. fclose($handle);
  24. } else {
  25. die("Error opening a file $filename");
  26. }
  27. $alldata[] = $data;
  28. }


polecenie
  1. print_r($alldata;

zwraca mi taką tablicę

  1. Array ( [0] => Array ( [0] => Array ( [0] => 2000000011379 [1] => 2 [2] => 1111 ) [1] => Array ( [0] => 9910000017803 [1] => 4 [2] => 1111 ) [2] => Array ( [0] => 2000000004389 [1] => 1 [2] => 1111 ) [3] => Array ( [0] => 3611588328010 [1] => 1 [2] => 1111 ) [4] => Array ( [0] => 3611588328034 [1] => 1 [2] => 1111 ) [5] => Array ( [0] => 2000000041681 [1] => 1 [2] => 1111 ) [6] => Array ( [0] => 3611589705155 [1] => 1 [2] => 1111 ) [7] => Array ( [0] => 3611589705186 [1] => 1 [2] => 1111 ) [8] => Array ( [0] => 2000000045047 [1] => 1 [2] => 1111 ) [9] => Array ( [0] => 3611589427804 [1] => 1 [2] => 1111 ) [10] => Array ( [0] => 2000000037455 [1] => 1 [2] => 1111 ) [11] => Array ( [0] => 3611588324999 [1] => 1 [2] => 1111 ) [12] => Array ( [0] => 3611588325095 [1] => 1 [2] => 1111 ) [13] => Array ( [0] => 3611588328003 [1] => 1 [2] => 1111 ) [14] => Array ( [0] => 3611588324968 [1] => 1 [2] => 1111 ) [15] => Array ( [0] => 8718155285068 [1] => 8 [2] => 1111 ) [16] => Array ( [0] => 2000000009162 [1] => 1 [2] => 1111 ) [17] => Array ( [0] => 2000000009179 [1] => 1 [2] => 1111 ) [18] => Array ( [0] => 2000000009186 [1] => 1 [2] => 1111 ) [19] => Array ( [0] => [1] => 1111 [2] => 1111 ) ) [1] => Array ( [0] => Array ( [0] => 8719253039157 [1] => 3 [2] => 1112 ) [1] => Array ( [0] => 8718604436164 [1] => 3 [2] => 1112 ) [2] => Array ( [0] => 8718935214806 [1] => 3 [2] => 1112 ) [3] => Array ( [0] => 8054398165324 [1] => 1 [2] => 1112 ) [4] => Array ( [0] => 8054398165331 [1] => 1 [2] => 1112 ) [5] => Array ( [0] => 8050758817209 [1] => 1 [2] => 1112 ) [6] => Array ( [0] => 8054398079065 [1] => 1 [2] => 1112 ) [7] => Array ( [0] => 8054398199701 [1] => 1 [2] => 1112 ) [8] => Array ( [0] => 8054398088227 [1] => 1 [2] => 1112 ) [9] => Array ( [0] => 8050758722435 [1] => 1 [2] => 1112 ) [10] => Array ( [0] => 8054398225905 [1] => 1 [2] => 1112 ) [11] => Array ( [0] => 8054398193518 [1] => 1 [2] => 1112 ) [12] => Array ( [0] => [1] => 1112 [2] => 1112 ) ) [2] => Array ( [0] => Array ( [0] => 8050758099445 [1] => 1 [2] => 1122 ) [1] => Array ( [0] => 8054398200032 [1] => 1 [2]
  2. .
  3. .
  4. .
  5. y ( [0] => [1] => 5301 [2] => 5301 ) ) [244] => Array ( [0] => Array ( [0] => 2000000045511 [1] => 5 [2] => 5302 ) [1] => Array ( [0] => 2000000045504 [1] => 5 [2] => 5302 ) [2] => Array ( [0] => 2000000045443 [1] => 7 [2] => 5302 ) [3] => Array ( [0] => 2000000056388 [1] => 2 [2] => 5302 ) [4] => Array ( [0] => [1] => 5302 [2] => 5302 ) ) [245] => Array ( [0] => Array ( [0] => 2000000070964 [1] => 1 [2] => 5303 ) [1] => Array ( [0] => 2000000061030 [1] => 8 [2] => 5303 ) [2] => Array ( [0] => 2000000061023 [1] => 6 [2] => 5303 ) [3] => Array ( [0] => [1] => 5303 [2] => 5303 ) ) [246] => Array ( [0] => Array ( [0] => 2000000061313 [1] => 2 [2] => 5304 ) [1] => Array ( [0] => 2000000061450 [1] => 5 [2] => 5304 ) [2] => Array ( [0] => 2000000061054 [1] => 5 [2] => 5304 ) [3] => Array ( [0] => 2000000061276 [1] => 2 [2] => 5304 ) [4] => Array ( [0] => 2000000061269 [1] => 2 [2] => 5304 ) [5] => Array ( [0] => 2000000061337 [1] => 1 [2] => 5304 ) [6] => Array ( [0] => 2000000061047 [1] => 4 [2] => 5304 ) [7] => Array ( [0] => 2000000061467 [1] => 1 [2] => 5304 ) [8] => Array ( [0] => 2000000061368 [1] => 1 [2] => 5304 ) [9] => Array ( [0] => 2000000061238 [1] => 3 [2] => 5304 ) [10] => Array ( [0] => 2000000061290 [1] => 2 [2] => 5304 ) [11] => Array ( [0] => 2000000061306 [1] => 4 [2] => 5304 ) [12] => Array ( [0] => 2000000061375 [1] => 2 [2] => 5304 ) [13] => Array ( [0] => 2000000061399 [1] => 3 [2] => 5304 ) [14] => Array ( [0] => 2000000061429 [1] => 1 [2] => 5304 ) [15] => Array ( [0] => 2000000061436 [1] => 1 [2] => 5304 ) [16] => Array ( [0] => 2000000061443 [1] => 1 [2] => 5304 ) [17] => Array ( [0] => [1] => 5304 [2] => 5304 ) ) [247] => Array ( [0] => Array ( [0] => 2000000062969 [1] => 2 [2] => 5305 ) [1] => Array ( [0] => 2000000062846 [1] => 1 [2] => 5305 ) [2] => Array ( [0] => 2000000062778 [1] => 2 [2] => 5305 ) [3] => Array ( [0] => 2000000061405 [1] => 1 [2] => 5305 ) [4] => Array ( [0] => 2000000061382 [1] => 5 [2] => 5305 ) [5] => Array ( [0] => 2000000061320 [1] => 2 [2] => 5305 ) [6] => Array ( [0] => 2000000062853 [1] => 1 [2] => 5305 ) [7] => Array ( [0] => 2000000062877 [1] => 2 [2] => 5305 ) [8] => Array ( [0] => 2000000062815 [1] => 2 [2] => 5305 ) [9] => Array ( [0] => 2000000062839 [1] => 2 [2] => 5305 ) [10] => Array ( [0] => [1] => 5305 [2] => 5305 ) ) [248] => Array ( [0] => Array ( [0] => 2000000064710 [1] => 4 [2] => 5306 ) [1] => Array ( [0] => 2000000064727 [1] => 4 [2] => 5306 ) [2] => Array ( [0] => 2000000064581 [1] => 1 [2] => 5306 ) [3] => Array ( [0] => 2000000064673 [1] => 1 [2] => 5306 ) [4] => Array ( [0] => 2000000064697 [1] => 6 [2] => 5306 ) [5] => Array ( [0] => 2000000064611 [1] => 1 [2] => 5306 ) [6] => Array ( [0] => 2000000064529 [1] => 4 [2] => 5306 ) [7] => Array ( [0] => 2000000064536 [1] => 1 [2] => 5306 ) [8] => Array ( [0] => 2000000064543 [1] => 6 [2] => 5306 ) [9] => Array ( [0] => 2000000064550 [1] => 8 [2] => 5306 ) [10] => Array ( [0] => [1] => 5306 [2] => 5306 ) ) )



Chwilkę to trwało ale prawie sobie poradziłem.
Dopisałem taki fragment:

  1. // coś takieto dopisałem i prawie jest ok
  2.  
  3. foreach ($alldata as $dataone){
  4.  
  5. for ($i = 0; $i < count($dataone); ++$i) {
  6. for ($j = 0; $j < count($dataone[$i]); ++$j){
  7. echo $dataone[$i][$j] . ', ';
  8. }
  9. echo "<br />";
  10. }
  11. }
  12.  


jednak na koniec każdego pliku dodaje mi podwójnie jego nazwę... i nie do końca wiem skąd to się bierze.
nospor
Nie bardzo rozumiem jaki masz teraz blad. Jak moze ci dodawac cos do pliku i to podwojnie i to nazwe, jesli:

1) w danych co pokazales nie ma nazw tylko jakies liczby
2) Nie zapisujesz nic do pliku tylko robisz ECHO tych jakis liczb.
SmokAnalog
Zobacz i przeanalizuj:

  1. <?php
  2.  
  3. $filePaths = array_filter(glob('Remanent/*'), 'is_file');
  4.  
  5. $productsData = array_map(function ($filePath) {
  6. $fileContent = file_get_contents($filePath);
  7.  
  8. if (!preg_match('#^(\w+),(\d+)$#', $fileContent, $matches)) {
  9. return null;
  10. }
  11.  
  12. list($ean, $quantity) = array_slice($matches, 1);
  13.  
  14. return [
  15. 'ean' => $ean,
  16. 'quantity' => (int) $quantity
  17. ];
  18. }, $filePaths);
  19.  
  20. $fileNames = array_map(function ($filePath) {
  21. return pathinfo($filePath, PATHINFO_FILENAME);
  22. }, $filePaths);
  23.  
  24. $productsData = array_filter(array_combine($fileNames, $productsData));


To da Ci w $productsData tablicę asocjacyjną, gdzie klucz to nazwa pliku (bez rozszerzenia), a wartość to tablica ['ean' => ..., 'quantity' => ...].

Dodatkowo masz tu walidację czy na pewno plik zawiera dane w formacie ean, przecinek, liczba. Warto też zrobić walidację samego ean w zależności od tego jak go zapisujecie.

Przepraszam za gotowca smile.gif
Lobek
Za gotowca się nie gniewam. smile.gif

Rozwiązanie dużo leprze niż moje ale nie mogę czegoś zrozumieć.

  1. $productsData = array_map(function ($filePath) {
  2. $fileContent = file_get_contents($filePath);
  3.  
  4. if (!preg_match('#^(\w+),(\d+)$#', $fileContent, $matches)) {
  5. return null;
  6. }
  7. // to powiedzmy, że rozumiem tworzymy tablicę która powinna zawierać zawartość pliku (tylko po spełnieniu warunku)
  8. // a jako druga wartość nazwę pliku bez rozszerzenia
  9.  
  10. list($ean, $quantity) = array_slice($matches, 1);
  11.  
  12. // tutaj tniemy plik na wiersze
  13.  
  14. return [
  15. 'ean' => $ean,
  16. 'quantity' => (int) $quantity
  17. ];
  18.  
  19. // tworzymy tablice asocjacyjną
  20.  
  21. }, $filePaths);
  22.  


niestety
  1. print_r($productsData);

w tym miejscu nic nie zwraca i sam niewiem dla czego.
SmokAnalog
Nic nie zwraca, tzn. masz pustą tablicę czy błąd? Powinno działać, przetestowałem smile.gif
Lobek
Dokładnie po tym :

  1. <?php
  2.  
  3. $filePaths = array_filter(glob('Remanent/*.TXT'), 'is_file');
  4. $productsData = array_map(function ($filePath) {
  5. $fileContent = file_get_contents($filePath);
  6. if (!preg_match('#^(\w+),(\d+)$#', $fileContent, $matches)) {
  7. return null;
  8. }
  9.  
  10. list($ean, $quantity) = array_slice($matches, 1);
  11. return [
  12. 'ean' => $ean,
  13. 'quantity' => (int) $quantity
  14. ];
  15. }, $filePaths);
  16. $fileNames = array_map(function ($filePath) {
  17. return pathinfo($filePath, PATHINFO_FILENAME);
  18. }, $filePaths);
  19. print_r($productsData);


Zwraca mi tablicę z ilością wartości równą liczbie plików ale jest pusta
SmokAnalog
Tablica z liczbą wartości > 0 i jednocześnie pusta? Tego jeszcze w przyrodzie nie było tongue.gif

A mówiąc poważniej, to chyba mnie zmyliły Twoje źle osadzone nawiasy klamrowe. Myślałem, że jedziesz plik linia po linii, ale czytasz na dobrą sprawę tylko pierwszą linię. Podaj jakąś przykładową zawartość pliku - czy w jednym pliku może być więcej niż jeden kod? Czy oprócz wpisów kod,ilość znajduje się w nich coś innego? Ja (chyba błędnie) założyłem, że jeden plik to tylko jeden wpis.
Lobek
Przykładowa zawartość pliku :

8718939306033,2
8718936682123,1
8718936682154,2

SmokAnalog
Czyli rzeczywiście moje założenie było błędne.

Odpowiedz mi jeszcze na dwa pytania:
  1. Czy numer EAN zawsze ma u Ciebie 13 cyfr?
  2. Co oznacza nazwa pliku? Czy to istotna informacja?
Lobek
Niestety kody mają różne długości
nazwa pliku jest bardzo istotna.

Przykładowo mam plik który nazywa się 2311.TXT
a jego zawartość to:
8718939306033,2
8718936682123,1
8718936682154,2

kolejny to 2312.TXT
8054398165324,1
8054398165331,1
8050758817209,1

ja potrzebuję uzyskać coś takiego


8718939306033,2,2311
8718936682123,1,2311
8718936682154,2,2311
8054398165324,1,2312
8054398165331,1,2312
8050758817209,1,2312

SmokAnalog
Odświeżony kodzik:

  1. <?php
  2.  
  3. $filePaths = array_filter(glob('Remanent/*.TXT'), 'is_file');
  4.  
  5. $productsData = array_map(function ($filePath) {
  6. $fileContent = file_get_contents($filePath);
  7.  
  8. if (preg_match_all('#^(\d+),(\d+)$#m', $fileContent, $matches, PREG_SET_ORDER) === 0) {
  9. return null;
  10. }
  11.  
  12. return array_map(function ($record) {
  13. list($ean, $quantity) = array_slice($record, 1);
  14.  
  15. return [
  16. 'ean' => $ean,
  17. 'quantity' => (int) $quantity
  18. ];
  19. }, $matches);
  20. }, $filePaths);
  21.  
  22. $fileNames = array_map(function ($filePath) {
  23. return pathinfo($filePath, PATHINFO_FILENAME);
  24. }, $filePaths);
  25.  
  26. $productsData = array_filter(array_combine($fileNames, $productsData));


Zobacz, co teraz masz w $productsData.
Lobek
niestety tylko:
Aray ()

a przed ostatnią linią kodu

Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => )

plików w katalogu mam 9
SmokAnalog
Najprawdopodobniej masz jakieś białe znaki w tych plikach. Wrzuć gdzieś jeden z plików txt i podaj link - zobaczę co w nich siedzi.
Lobek
na końcu każdej linii jest 7 spacji
SmokAnalog
Tak myślałem. Czyli śmieci w pliku. To albo wyczyść pliki, albo zamień wzorzec '#^(\d+),(\d+)$#m' na '#^(\d+),(\d+)\s*$#m'
Lobek
Bardzo dziękuję za pomoc smile.gif
SmokAnalog
Poradzisz sobie teraz z użyciem tej tablicy, którą masz w $productsData?
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.