Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Odczyt z pliku określonej liczby linii, rekurencja
jager91
post 15.02.2017, 16:50:03
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.02.2017

Ostrzeżenie: (0%)
-----


Cześć
Robię aplikację do wyszukiwania najtańszej ścieżki w macierzy. Tablice są odczytywane z pliku txt. O ile liczenie ścieżki działa dobrze tak muszę to zmodyfikować tak, żeby w pliku mogło byc kilka tabel. W linii przed macierzą ma znajdować się liczba określająca wielkość tablicy.
Wygląda to mniej więcej tak:
3
1,2,3
4,5,6
7,8,9
2
1,2
3,4

O ile dla wariantu z jedną tablicą wszystko działa tak już nie mam koncepcji jak to wywołać jeszcze raz żeby odczytało tylko następną tablicę.

  1. function getMatrix($count = 0) {
  2. if (!file_exists('matrix.txt')) {
  3. die("blad otwarcia pliku");
  4. }
  5.  
  6. $file = fopen('matrix.txt', "r");
  7.  
  8. while (!feof($file)) {
  9. $line = fgets($file);
  10. $count = $line[$count];
  11.  
  12. for ($i = 0; $i < $count; $i++){
  13. $line = fgets($file);
  14. $numbers[] = explode(",", $line);
  15. }
  16.  
  17. minimumEffor($numbers);
  18. }
  19.  
  20. fclose($file);
  21. }


Tak to działa dla jednej tabeli, jak wpiszę coś pod spodem wyskakują błędy z offsetem. Chciałbym, żeby pobierana była tylko ilość linijek z linii określającej wielkość macierzy, jeżeli plik nie jest pusty to funkcja jest wywoływana jeszcze raz, jednak nie pobiera pliku od początku tylko od następnej tablicy.
Zamotałem, jednak po funkcji od ścieżki już przestaje myśleć.
Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
viking
post 15.02.2017, 17:05:18
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A musi to być w takiej formie zapisane? Łatwiej coś w stylu: 3|1,2,3... i kolejna linia. Wczytujesz przy użyciu file i explode


--------------------
Go to the top of the page
+Quote Post
jager91
post 15.02.2017, 17:11:53
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.02.2017

Ostrzeżenie: (0%)
-----


No właśnie musi być taka forma :/
Go to the top of the page
+Quote Post
Tomplus
post 15.02.2017, 17:48:08
Post #4





Grupa: Zarejestrowani
Postów: 1 875
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Może spróbuj operować na pliku jako stringu.

  1. $str = file_get_content('matrix.txt');
  2. $line = explode("\n", $str);
  3. $lines = count($line);
  4.  
  5. for ($i = 0; $i < $lines; $i++){
  6. $numbers[] = explode(",", $line[$i]);
  7. }
  8. print_r($numbers);


Wynik przedstawia się tak:

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


Teraz tworzysz funkcję, odczytującą określoną linię, jeżeli brak tej linii to użyj funkcji end($numbers) i wyświetli Ci tablicę ostatniej linijki w kodzie.

Ten post edytował Tomplus 15.02.2017, 17:50:38
Go to the top of the page
+Quote Post
viking
post 15.02.2017, 18:25:10
Post #5





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Dobrze rozumiem że te dane chcesz?

  1. function getMatrix($count = 0) {
  2. if (!file_exists('matrix.txt')) {
  3. die("blad otwarcia pliku");
  4. }
  5.  
  6. $array = file('matrix.txt');
  7.  
  8. $arrayobject = new ArrayObject($array);
  9. $iterator = $arrayobject->getIterator();
  10. $count = $iterator->count() - 1;
  11.  
  12. $a = [];
  13.  
  14. while($iterator->valid()) {
  15.  
  16. $current = (int) $iterator->current();
  17. $a[] = $current;
  18. $jump = $iterator->key() + $current + 1;
  19.  
  20. if ($count > $jump) {
  21. $iterator->seek($jump);
  22. } else {
  23. break;
  24. }
  25.  
  26. }
  27.  
  28.  
  29. var_dump($a);
  30.  
  31.  
  32. }
  33.  
  34. getMatrix();


--------------------
Go to the top of the page
+Quote Post
jager91
post 15.02.2017, 18:54:29
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 15.02.2017

Ostrzeżenie: (0%)
-----


Nie do końca bo odczytuje tylko jedną linijkę z tego co na szybko sprawdziłem.
Zrobiłem to troche w inny sposób, pobrałem cały plik, lece po całym pliku foreachem, sprawdzam która linijka nie ma przecinka, jak na taką trafię to odpalam pętlę która jako iterator przyjmuje wartość pobranej linijki. Wszystko śmiga.
Dzięki za pomoc Panowie smile.gif
Go to the top of the page
+Quote Post
viking
post 15.02.2017, 19:16:11
Post #7





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


O ile plik miał strukturę jak w pierwszym poscie czyli zaczyna się od wielkosci macierzy, nie ma opcji żeby czytał jedną linię.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 08:50