Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wybór pliku o największym rozmiarze spośród kilku
Forum PHP.pl > Forum > Przedszkole
mirobor
Gryzę się z takim o to problemem.
Potrzebuję zaimportować do nowego sklepu grafiki ze starego systemu. Stary sklep w zależności od działań obsługującego, zapisywał na serwerze od 1 do 6 plików o różnych rozmiarach i wadze dla danego produktu. Od najmniejszej miniatury do dużej grafiki galeryjnej.
Nazwy plików mają n/w przykładowe postaci dla produktu o id: 556654:
556654_sgnk34nkl3nn4ked.png
556654_ssfmlsfmlmr847ja.png
556654_35hknkfjkjsrjf34we.png
556654_689ghkhu9ukbjkbk.png

Do przeniesienia tych aktualnych użyłem:
  1. $files = glob($string . "*");
  2. if(count($files > 0))
  3. for ($i=0; $i<count($files); $i++)
  4. {
  5. $a = copy($files[$i], 'img_nowe/'.$files[$i]))
  6. }

gdzie $string to pobierany z bazy kod produktu.

Jak spośród od 1 do 6 plików zawierających określony string w nazwie, znaleźć i przenieść tylko ten 1 z nich który najwięcej waży?


Turson
  1. $naj['rozmiar'] = 0;
  2. $naj['plik'] = null;
  3. $files = glob($string . "*");
  4. if(count($files > 0))
  5. for ($i=0; $i<count($files); $i++)
  6. {
  7. $rozmiar = filesize($files[$i]);
  8. if($rozmiar>$naj['rozmiar'])
  9. $naj['plik'] = $files[$i];
  10. }
  11. // skopiuj plik z $naj['plik']
mirobor
Dziękuje za odpowiedź ale niestety to nie działa i nie może działać skoro
  1. $naj['rozmiar']=0;

W pętli wyświetla wszystko co >0.
Jakiś ugrade, albo inne pomysły?
mar1aczi
  1. $naj['plik'] = null;
  2. $files = glob($string . "*");
  3. if(count($files > 0)) {
  4. $naj['rozmiar'] = filesize($files[0]);
  5. for ($i=0; $i<count($files); $i++)
  6. {
  7. $rozmiar = filesize($files[$i]);
  8. if($rozmiar>$naj['rozmiar']) {
  9. $naj['rozmiar']=$rozmiar;
  10. $naj['plik'] = $files[$i];
  11. }
  12. }
  13. }
  14. // skopiuj plik z $naj['plik']


Edycja: poprawka za uwagą irmidjusz
irmidjusz
mirobor, pomyśl chwilę, proszę. W pętli trzeba zapamiętywać rozmiar największego dotychczas znalezionego pliku, aby go porównywać z następną wartością.
Turson
Też się poprawiam:
  1. $pliki = array();
  2. $files = glob($string . "*");
  3. if(count($files > 0))
  4. for ($i=0; $i<count($files); $i++)
  5. {
  6. $rozmiar = filesize($files[$i]);
  7. $pliki[$rozmiar] = $files[$i];
  8. }
  9. echo max($pliki);

mirobor
@irmidjusz - siedzę i myślę, myślę i siedzę... i całkowicie nie wiem co mam wg Ciebie wymyśleć. Zupełnie szczerze -bez obrazy.

Na przykładzie z życia. Mam w przypadku
  1. $string = '0400000034058';

następujące pliki o wypisaniej wadze:

0400000034058_35254467249cb86fd2d3ac_40.png - 4 KB
0400000034058_66244925849cb86fb969f6_200.png - 51 KB
0400000034058_97965927449cb86fc9171f_100.png - 16 KB
0400000034058_213095399849cb86f622116_100.png - 16 KB
0400000034058_213095399849cb86f622116_600.png - 400 KB

Ostatni kod @Turson
  1. $string = '0400000034058';
  2. $pliki = array();
  3. $files = glob($string . "*");
  4. if(count($files > 0))
  5. for ($i=0; $i<count($files); $i++)
  6. {
  7. $rozmiar = filesize($files[$i]);
  8. $pliki[$rozmiar] = $files[$i];
  9. }
  10. echo max($pliki)


wyświetla: 0400000034058_66244925849cb86fb969f6_200.png.png

Jeżeli faktycznie powinienem głębiej pomyśleć proszę o kopa w dobrym kierunku.
Turson
Co zwraca?
  1. $string = '0400000034058';
  2. $pliki = array();
  3. $files = glob($string . "*");
  4. if(count($files > 0))
  5. for ($i=0; $i<count($files); $i++)
  6. {
  7. $rozmiar = filesize($files[$i]);
  8. $pliki[$rozmiar] = $files[$i];
  9. echo $files[$i].' waży '.$rozmiar.'<br>';
  10. }
  11. echo '<pre>';
  12. print_r($files);
  13. echo '</pre>';
  14. echo max($pliki)
mirobor
img_my/img_all/0400000034058_12739942049cb88549cee0_100.png waży 15765
img_my/img_all/0400000034058_139746570749cb885537f9b_40.png waży 3181
img_my/img_all/0400000034058_173261301849cb884e27f29_100.png waży 15765
img_my/img_all/0400000034058_173261301849cb884e27f29_600.png waży 411740
img_my/img_all/0400000034058_191095430049cb8853a234a_200.png waży 52123

  1. (
  2. [0] => img_my/img_all/0400000034058_12739942049cb88549cee0_100.png
  3. [1] => img_my/img_all/0400000034058_139746570749cb885537f9b_40.png
  4. [2] => img_my/img_all/0400000034058_173261301849cb884e27f29_100.png
  5. [3] => img_my/img_all/0400000034058_173261301849cb884e27f29_600.png
  6. [4] => img_my/img_all/0400000034058_191095430049cb8853a234a_200.png
  7. )


img_my/img_all/0400000034058_191095430049cb8853a234a_200.png
Turson
Rozkminiam o co chodzi, a trzeba wyprintować $pliki a nie $files smile.gif
mirobor
Bardzo muczios very gracias. Ja w tym czasie przeglądam Twojego bloga i skrypty. Very interesting wink.gif
Turson
Nagle działa? print_r nie miał nic wspólnego z poprawnym działaniem
mirobor
Wydaje się, że ten wyedytowany przez @mar1aczi pod wpływem: Edycja: poprawka za uwagą irmidjusz działa.
  1. $naj['plik'] = null;
  2. $files = glob($string . "*");
  3. if(count($files > 0)) {
  4. $naj['rozmiar'] = filesize($files[0]);
  5. for ($i=0; $i<count($files); $i++)
  6. {
  7. $rozmiar = filesize($files[$i]);
  8. if($rozmiar>$naj['rozmiar']) {
  9. $naj['rozmiar']=$rozmiar;
  10. $naj['plik'] = $files[$i];
  11. }
  12. }
  13. }
  14. // skopiuj plik z $naj['plik']

Testuję...

Działa idealnie. Bardzo Wam dziękuję. Przeanalizuję kod, zapamiętam i to już kolejna moja nauka dzięki Wam i forum.php.pl
Thank you very much SIRS.
mar1aczi
Cytat(mirobor @ 30.05.2014, 23:10:24 ) *
Przeanalizuję kod, zapamiętam ...

Nie ucz się kodu na pamięć! Większe "owoce wyda" jego dogłębne zrozumienie linijka po linijce co się dzieje i dlaczego, tzn. prawidłowe układanie/rozumowanie algorytmów. To przełoży Ci się na umiejętność pisania kodu dla nowych wyzwań.
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.