Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] zmiana ciągu znaków w tablice
Forum PHP.pl > Forum > Przedszkole
Regss
Witam! Potrzebuje małej pomocy.
Przykładowo mam taki oto ciąg znaków:
Kod
File Size : 79 kB : Make : Canon : Camera Model Name : Canon PowerShot A510 : Create Date : 2005:07:20 05:05:27 : Exposure Time : 1/125 : F Number : 8.0 : Flash : On, Red-eye reduction : Exposure Compensation : 0 : Focal Length : 23.2mm : White Balance : Auto : Image Size : 640x480


i chciał bym przekształcić go na tablice wyglądającą następująco:

Kod
[File Size] => 79 kB
[Make] => Canon
[Camera Model Name] => Canon PowerShot A510
[Create Date] => 2005:07:20 05:05:27
itd...


Domyślam się, że trzeba urzyć funkcji explode() tylko nie wiem dokładnie jak. Proszę o pomoc. Pozdrawiam.
Kuziu
  1. <?
  2. $tekst = 'File Size : 79 kB : Make : Canon : Camera Model Name : Canon PowerShot A510 : Cr
    eate Date : 2005:07:20 05:05:27 : Exposure Time : 1/125 : F Number : 8.0 : Flash : On, Red-eye reduction : Exposure Compensation : 0 : Focal Length : 23.2mm : White Balanc
    e : Auto : Image Size : 640x480'
    ;
  3. $tmp = split(" : ", $tekst);
  4.  
  5. for($i=0; $i<count($tmp); $i+=2){
  6. $wynikowaTablica[$tmp[$i]] = $tmp[($i+1)];
  7. }
  8.  
  9. var_dump($wynikowaTablica);
  10. ?>


Jeśli tam miedzy dwukropkami nie ma spacji to je wywal, ale chyba muszą być ze względu na zapis czasu z dwukropkami
Regss
Tak jest spacja po prawej i lewej stronei każdego dwukropka, tylko nie wiem czemu po zastosowaniu Twojego skryptu uzyskuje:
Kod
Array ( [File Size ] => 79 kB [Make ] => Canon [Camera Model Name ] => Canon PowerShot A510 [Create Date ] => 2005:07:20 05:05:27 [Exposure Time ] => 1/125 [F Number ] => 8.0 [Flash ] => On, Red-eye reduction [Exposure Compensation ] => 0 [Focal Length ] => 23.2mm [White Balance ] => Auto [Image Size ] => 640x480 ) 1

Nie wiem czemu są spacje w każdym kwadratowym nawiasie powinny być usuwane?

tak wygląda mój cały skrypt:

  1. <?php
  2. $exif_filename = "test2.jpg";
  3. $exif_image_path = "$exif_filename";
  4. $perl_path = "/usr/bin/perl";
  5. $exiftool_path = "cgi-bin/exiftool";
  6. exec("$perl_path $exiftool_path -filesize -make -model -createdate -exposuretime -fnumber -iso -flash -exposurecompensation -focallength -quality -whitebalance -imagesize $exif_image_path", $exif_table);
  7. $exif_table_re = implode($exif_table, " : ");
  8. $tmp = split(" : ", $exif_table_re);
  9. for($i=0; $i<count($tmp); $i+=2){
  10. $exif[$tmp[$i]] = $tmp[($i+1)];
  11. }
  12. echo print_r($exif);
  13. ?>
Kuziu
Kod
array(11) { ["File Size"]=>  string(5) "79 kB" ["Make"]=>  string(5) "Canon" ["Camera Model Name"]=>  string(20) "Canon PowerShot A510" ["Create Date"]=>  string(19) "2005:07:20 05:05:27" ["Exposure Time"]=>  string(5) "1/125" ["F Number"]=>  string(3) "8.0" ["Flash"]=>  string(21) "On, Red-eye reduction" ["Exposure Compensation"]=>  string(1) "0" ["Focal Length"]=>  string(6) "23.2mm" ["White Balance"]=>  string(4) "Auto" ["Image Size"]=>  string(7) "640x480" }


U mnie wynik jest taki uzywam php 5 moze w 4 trzeba zamienić do string'a klucz tablicy
Regss
Hmm dziwna sprawa ja sie nie znam na php ale uruchamiając sam Twój skrypt jest wszystko wporządku.

Może od początku:

po wykonaniu procedury exec
  1. <?php
  2. exec("$perl_path $exiftool_path -filesize -make -model -createdate -exposuretime -fnumber -iso -flash -exposurecompensation -focallength -quality -whitebalance -imagesize $exif_image_path", $exif_table);
  3. ?>

Uzyskuje tablice:
Kod
Array ( [0] => File Size : 79 kB [1] => Make : Canon [2] => Camera Model Name : Canon PowerShot A510 [3] => Create Date : 2005:07:20 05:05:27 [4] => Exposure Time : 1/125 [5] => F Number : 8.0 [6] => Flash : On, Red-eye reduction [7] => Exposure Compensation : 0 [8] => Focal Length : 23.2mm [9] => White Balance : Auto [10] => Image Size : 640x480 ) 1

Ale że potrzebuje ją w innym formacie [File Size] => 79 kB wykonałem zamiane tablicy na ciąg znaków za pomocą:
  1. <?php
  2. $exif_table_re = implode($exif_table, " : ");
  3. ?>

i uzyskałem:
Kod
File Size : 79 kB : Make : Canon : Camera Model Name : Canon PowerShot A510 : Create Date : 2005:07:20 05:05:27 : Exposure Time : 1/125 : F Number : 8.0 : Flash : On, Red-eye reduction : Exposure Compensation : 0 : Focal Length : 23.2mm : White Balance : Auto : Image Size : 640x4801

I następnie wykonując Twój skrypt wychodzi ze spacjami wiesz może gdzie leży błąd, bo ja jestem zielony z php ;]
mike
Spacje nie byłyby dla Was problemem jakbyście zajrzeli do manuala tongue.gif
Użycie trim() niweluje problem.
Regss
Ehh spróbowałem tej funkcji trim() ale nic nie pomogło, chyba że źle ją zastosowałem tongue.gif

oto cały kod:
  1. <?
  2. $exif_filename = "test2.jpg";
  3. $exif_image_path = "$exif_filename";
  4. $perl_path = "/usr/bin/perl";
  5. $exiftool_path = "cgi-bin/exiftool";
  6. exec("$perl_path $exiftool_path -filesize -make -model -createdate -exposuretime -fnumber -iso -flash -exposurecompensation -focallength -quality -whitebalance -imagesize $exif_image_path", $exif_table);
  7. $exif_table_re = implode($exif_table, " : ");
  8. $tmp = split(":", $exif_replace_re);
  9. for($i=0; $i<count($tmp); $i+=2){
  10. $exif[$tmp[$i]] = $tmp[($i+1)];
  11. }
  12. echo "Tablica pobrana z programu \"\$exif_table\"";
  13. echo "</br></br>";
  14. var_dump($exif_table);
  15. echo "</br></br>";
  16. echo "Ciąg znaków po wykonaniu funkcji implode odzielanie \" : \"";
  17. echo "</br></br>";
  18. echo $exif_table_re;
  19. echo "</br></br>";
  20. echo "Tablica po wykonaniu funkcji split łączone \" : \"";
  21. echo "</br></br>";
  22. echo "Funkcja trim nie daje rezultatów:";
  23. echo "</br></br>";
  24. echo trim($exif_table_re);
  25. echo "</br></br>";
  26. ?>


A oto rezultaty: http://regss.no-ip.org/~ble/index4.php sprawdźcie na podglądzie źródła strony ile tam jest tych spacji ;]
siemakuba
użyj trim przy tworzeniu tablicy a nie wyświetlaniu.

  1. <?php
  2. for($i=0; $i<count($tmp); $i+=2){
  3. $exif[trim($tmp[$i])] = $tmp[($i+1)];
  4. }
  5. ?>


poza tym, jezeli na twoim serwerze sa dostepne, uzyj PHPowych funkcji Exif, bo widze ze wlasnie takie dane pobierasz za pomoca skryptu perla.

pozdr.
Regss
Cytat(siemakuba @ 2006-05-13 17:40:53)
użyj trim przy tworzeniu tablicy a nie wyświetlaniu.

Po zmianie na Twój kod otrzymałem: array(1) { [""]=> NULL }

A co do EXIF pobieranego za pomocą exif_read_data to nie jestem przekonany ponieważ nie jest on dopracowany wole użyć biblioteki napisanej w PERL'u
siemakuba
Cytat
Po zmianie na Twój kod otrzymałem: array(1) { [""]=> NULL }

mozesz pokazac ten kod? bo ja po var_dump($exif) otrzymalem:
Kod
array
  'File Size' => ' 79 kB ' (length=7)
  'Make' => ' Canon ' (length=7)
  'Camera Model Name' => ' Canon PowerShot A510 ' (length=22)
  'Create Date' => ' 2005' (length=5)
  '07' => '20 05' (length=5)
  '05' => '27 ' (length=3)
  'Exposure Time' => ' 1/125 ' (length=7)
  'F Number' => ' 8.0 ' (length=5)
  'Flash' => ' On, Red-eye reduction ' (length=23)
  'Exposure Compensation' => ' 0 ' (length=3)
  'Focal Length' => ' 23.2mm ' (length=8)
  'White Balance' => ' Auto ' (length=6)
  'Image Size' => ' 640x4801' (length=9)


pozdr.

edit: z mojego dumpa widać, że przyda się też trim() na wartościach tworzonej tablicy, a nie tylko na kluczach.
Regss
  1. <?
  2. $exif_filename = "test2.jpg";
  3. $exif_image_path = "$exif_filename";
  4. $perl_path = "/usr/bin/perl";
  5. $exiftool_path = "cgi-bin/exiftool";
  6. exec("$perl_path $exiftool_path -filesize -make -model -createdate -exposuretime -fnumber -iso -flash -exposurecompensation -focallength -quality -whitebalance -imagesize $exif_image_path", $exif_table);
  7. $exif_table_re = implode($exif_table, " : ");
  8. $tmp = split(":", $exif_replace_re);
  9. for($i=0; $i<count($tmp); $i+=2){
  10. $exif[trim($tmp[$i])] = $tmp[($i+1)];
  11. }
  12. var_dump($exif);
  13. ?>


Nie wiem jaki tu jest błąd.
siemakuba
błąd pochodzi stąd:
- po wykonaniu skryptu perla wynik otzymujesz w postaci tablicy do zmiennej $exif_table
- tworzysz zmienna $exif_table_re łącząc tablicę $exif_table za pomocą implode($exif_table, " : ");
- dlaczego zatem tu jest $exif_replace_re ? juz w tym momencie masz blad, i ja dostalem go na ekran. Masz wylaczone error_reporting / display_errors?
  1. <?php
  2. $tmp = split(":", $exif_replace_re);
  3. ?>


podsumowując:
  1. <?
  2. $exif_filename = "test2.jpg";
  3. $exif_image_path = "$exif_filename";
  4. $perl_path = "/usr/bin/perl";
  5. $exiftool_path = "cgi-bin/exiftool";
  6.  exec("$perl_path $exiftool_path -filesize -make -model -createdate -exposuretime -fnumber -iso -flash -exposurecompensation -focallength -quality -whitebalance -imagesize $exif_image_path", $exif_table);
  7.  
  8. $exif_table_re = implode($exif_table, " : ");
  9. $tmp = split(" : ", $exif_table_re);
  10. for($i=0; $i<count($tmp); $i+=2)
  11. {
  12. $exif[trim($tmp[$i])] = trim($tmp[($i+1)]);
  13. }
  14.  
  15. var_dump($exif);
  16. ?>


zwróć uwagę na linię 9
- string który chcesz podzelić to $exif_table_re a nie $exif_replace_re.
- jako separatora użyj " : " zamiast ":"

dodałem też trim na wartość tablicy w pętli for.

P.S. taki błąd powinieneś wychwycić sam. to prawie że literówka...

pozdr.
Regss
O faktycznie przepraszam mała pomyłka kombinowałem z funkcją str_replace i widocznie niechcący nie zmieniłem spowrotem małe przeoczenie. Jak mówiłem raczkuje w dziedzinie php, ale dzięki wam się już troche nauczyłem cool.gif Pozdro.
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.