Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczyt z pliku określonej liczby linii, rekurencja
Forum PHP.pl > Forum > PHP
jager91
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
viking
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
jager91
No właśnie musi być taka forma :/
Tomplus
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.
viking
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();
jager91
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
viking
O ile plik miał strukturę jak w pierwszym poscie czyli zaczyna się od wielkosci macierzy, nie ma opcji żeby czytał jedną linię.
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.