Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dane z pliku tablica?
Forum PHP.pl > Forum > PHP
Boshi
Mam sobie plik z kilkoma wierszami, odczytuje z niego dane przez funkcje file(wierszami) rozbijając je po separatorze funkcją explode.

Każdy wiersz powinien być nową tablicą? zwłaszcza, że potem muszę każdy wiersz wyświetlić na stronie po kolei. (do odpowiednich bloków html)
  1. $file=file("towary.txt");
  2. $McDonald=explode("|", $file[3]);
  3. $KFC=explode("|", $file[2]);


Wiersze pliku;

  1. hamburgery|McDonald|Hamburger Hebrajski|Hamburger hebrajski jest jednym z najbardziej napakowanych fastfoodów na świecie, spróbuj a się przekonasz|10|img/burger_sandwich_PNG413.png|img/mcdonald-s-psd-457848.png
  2. Pizze|PizzaHut|Pizza Watykańska|Pizza ta została poświęcona przez samego papieża-spróbuj jeśli masz odwagę|35|img/Pizza_margherita.png|img/PizzaHut.png



Jak posortować z tych dwóch tablic po cenie skoro tablica zawiera stringi, inty, png? Po prostu sortuję i na stronie mają się wyświetlać produkty w zależności od wielkości ceny
kreatiff
Ja bym to zrobił tak: po wczytaniu przez file za pomocą array_map rozbiłbym każdy wiersz na podtablicę, a potem za pomoca usort dowolnie sortował (czyli np. po cenie). I dopiero posortowaną dawał do wyświetlania w pętli.

Albo jakimś iteratorem bym wczytywał linia po linii i od razu rozbijał każdą z nich na tablicę i wrzucał do tablicy wielowymiarowej.
Boshi
Przykład? nie bardzo mogę to w pętli wypisać wszystko bo jak pisałem wyświetlane jest do odpowiednich bloków wszystko (bootstrapa)
np

  1. <div class="row">
  2. <div class="col-md-4">
  3. <div class="thumbnail">
  4. <?php echo $array['McDonald']; ?>
  5. <br>
  6. <div class="caption">
  7. <h3><?php echo $tablicaProduktow[1]; ?></h3>
  8.  
  9. <p><a href="Produkty.php?wartosc=McDonald" class="btn btn-primary btn-left" data-toggle="tooltip" data-placement="left" title="Produkty MCDonald!">Przejdź dalej</a></p>
  10. </div>
  11. </div>
  12. </div>
kreatiff
Zatem cały taki blok wędruje do pętli.

Jak już będziesz miał dowolnie stworzoną tablicę wielowymiarową, np.:
  1. $tablica = [
  2. 0 => ['typ' => 'hamburgery', 'producent' => 'McDonald', itd...],
  3. 1 => ['typ' => 'Pizze', 'producent' => 'PizzaHut', itd...]
  4. ]

To tablicę taką sobie sortujesz po dowolnym polu wspomnianą funkcją, a następnie w kodzie html dajesz:
  1. <?php foreach ( $tablica as $produkt ) : ?>
  2. <div class="row">
  3. <div class="col-md-4">
  4. <div class="thumbnail">
  5. <?php echo $produkt['miniatura']; ?>
  6. <br>
  7. <div class="caption">
  8. <h3><?php echo $produkt['typ']; ?></h3>
  9. <?php echo $produkt['opis']; ?>
  10. <p><a href="Produkty.php?wartosc=McDonald" class="btn btn-primary btn-left" data-toggle="tooltip" data-placement="left" title="Produkty <?php echo $produkt['producent']; ?>">Przejdź dalej</a></p>
  11. </div>
  12. </div>
  13. </div>
  14. <?php endforeach; ?>
itp.
Boshi
Czekaj, czekaj, jakaś logika w tym jest biggrin.gif

Teraz jeszcze raz, jak to podzielić na wielowymiarową tablicę?

array_map? w sensie najpierw rozbić każdy wiersz na osobną tablicę funkcją explode i potem wszystkie tablice wrzucić do array_map?
kreatiff
array_map to był przykład działania na gotowej tablicy, którą stworzy file. Ta funkcja sama w sobie nic nie tworzy, ale umozliwia edycję elementów istniejącej tablicy. Nie trzeba z niej korzystać, ale można, gdy cały plik wczytamy do pamięci od razu.

Możesz wykorzystać np. fgetcsv (1 przykład ze strony manuala), czy jakiś Iterator dostępny po stworzeniu obiektu klasy SplFileObject i tworzyć taką wielowymiarową tablicę już na etapie wczytywania pliku linia po linii (w tym wypadku cały plik nie wędruje do pamięci od razu - takie rozwiązanie będzie prawdopodobnie mnie pamięciożerne). Po prostu po wczytaniu linii następuje jej explode po "|" i dodanie tej podtablicy do jakiejś większej, wielowymiarowej.
Boshi
A coś takiego z wykorzystaniem array_chunk? tablica wielowymiarowa z kluczami w każdej pod tablicy- czyli tyle ile ma każdy wiersz.

$wynikowa=array_merge_recursive($tablicaProduktow,$tablicaProduktowPizze,$tabliceproduktowKurczaki);

$rows = array_chunk($wynikowa, 7);

Wynik:

Array
(
[0] => Array
(
[0] => hamburgery
[1] => McDonald
[2] => Hamburger Hebrajski
[3] => Hamburger hebrajski jest jednym z najbardziej napakowanych fastfood�w na �wiecie, spr�buj a si� przekonasz
[4] => 10
[5] => img/burger_sandwich_PNG413.png
[6] => img/mcdonald-s-psd-457848.png

)

[1] => Array
(
[0] => Pizze
[1] => PizzaHut
[2] => Pizza Watyka�ska
[3] => Pizza ta zosta�a po�wi�cona przez samego papie�a-spr�buj je�li masz odwag�
[4] => 35
[5] => img/Pizza_margherita.png
[6] => img/PizzaHut.png

)

[2] => Array
(
[0] => Kurczaki
[1] => KFC
[2] => Kurczak z warzywami
[3] => Kurczam z warzywami to jedyny w Europie kurczak zawieraj�cy niespotykane ilo�ci oraz rodzaje owoc�w- czy odwa�ysz si� i zaryzykujesz?
[4] => 20
[5] => img/kurczak-z-rozna.png
[6] => img/kfc-logo-2.png

)

)
kreatiff
To, które funkcje wykorzystasz to już kwestia optymalizacyjna. Wynik Twoich działań wygląda jak to co chcemy osiągnąć, więc jest w porządku.
Po prostu potem w kodzie zamiast odwołań w pętli do $tablica['produkt'], znajdzie się $tablica[0], itd. Będzie to działało dokładnie tak samo, a różnica to po prostu mniej czytelny zapis.
Boshi
Tak przetestowałem, faktycznie działa. A teraz jak to posortować? wg ceny?

coś takiego ?

  1. function sortuj ($x, $y)
  2. {
  3. if ($x[4]>$y[4]) return 1;
  4. else if ($x[4]==$y[4]) return 0;
  5. else if ($x[4]<$y[4]) return -1;
  6. usort($tab,'sortuj');
  7. }


Dobra kreatiff twoja pomoc okazała się nieoceniona, funkcja sortująca działa świetnie smile.gif Dzięki za pomoc!
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.