Autor | Zpráva | ||
---|---|---|---|
Milkys Profil |
#1 · Zasláno: 12. 11. 2011, 11:48:23 · Upravil/a: Milkys
Krásné slunečné poledne,
doufám, že někdo zkušenější bude u pc a poradí mi. <?php $xml = simplexml_load_file("soubor.xml"); $key = $xml->xpath("item"); foreach ($key as $item){ if ($item->neco == $key_nav) { $idpath = explode("/",$item->photos->photo); $hotid = $idpath[8]; //získám hotId, které je v 8. poli url fotografií } if ($hotid != 0) echo $hotid.', '; } ?> V tomto případě se vypíše $hotid v tomto tvaru: např. 25, 25, 25, 25, 25, 26, 26, 26, 26, 29, 29, 29, 29, 29, 29, a já potřebuji dostat v tomto případě: 25, 26, 29, Snad je to ze zadání pochopitelné čeho chci dosáhnout. Vím, že existuje něco jako preceding-sibling , ale zatím to neumím použít nebo se to dá udělat něčím jiným - jednodušeji? Děkuji za reakce. |
||
Chro Profil |
#2 · Zasláno: 12. 11. 2011, 18:14:22
Převeď si $hotid na pole, třeba funkcí explode. Funkce array_unique by to měla zredukovat na jedinečné položky.Vrací opět pole. Pak použij funkci implode.
|
||
Milkys Profil |
#3 · Zasláno: 12. 11. 2011, 21:51:49 · Upravil/a: Milkys
Chro:
vyzkošel jsem několik pokusů, ale žádný nebyl úspěšný. předposlední vypisuje Array, Array, Array, Array, ...... poslední vyhodí chybu: Warning: array_unique() [function.array-unique]: The argument should be an array in...... Explode umím použít, dokonce jsem si věřil i na funkci array_unique(), ale nějak jsem se do toho zamotal. No konec řečí, takhle jsem skončil, jsem v php začátečník a mějte se mnou chlapi trpělivost. <?php $xml = simplexml_load_file("soubor.xml"); $key = $xml->xpath("item"); foreach ($key as $item){ if ($item->neco == $key_nav) { $idpath = explode("/",$item->photos->photo); $help1 = "$idpath[8]','"; // do proměné musím doplnit čárku, kterou budu v explode dělit pole $help2 = explode(",", "$help1") $hotid = array_unique($help2); } if ($hotid != 0) echo $hotid.', '; //zkoušel jsem i přímo echo array_unique($hotid); taky bez úspěchu } ?> |
||
Chro Profil |
#4 · Zasláno: 12. 11. 2011, 22:19:45
Řekněme, že v $hotid je hodnota typu řetězec a čísla jsou od sebe oddělena znakem čárka a mezera.
$hotid = '2, 2, 2, 3, 3, 3, 4, 5'; $hotid = explode(', ', $hotid); //převod na pole $hotid = array_unique($hotid); //výběr unikátních hodnot $hotid = implode(', ', $hotid); //zpět na řetězec echo $hotid; //zobrazí 2, 3, 4, 5 |
||
Milkys Profil |
#5 · Zasláno: 12. 11. 2011, 23:13:54
Chro:
ano takto jsem to i zpočátku chápal je to jako v dokumentaci php. Jenže ty čísla, která získám z url fotky $idpath = explode("/",$item->photos->photo); $hotid = $idpath[8]; nejsou s čárkou, proto jsem ji tam doplňoval, abych měl v explode čím rozdělovat. To co píšeš byl jeden z mých prvních pokusů a je to divné, ale ta fce array_unique() jak kdyby tam nebyla. Prostě to vypíše zase všechny ty čísla i s čárkou. |
||
Chro Profil |
#6 · Zasláno: 12. 11. 2011, 23:33:19
Milkys:
Vrací to samé protože pokud se v explode pokusíš rozdělit řetězec oddělovačem, který není v řetězci zastoupen, explode vrátí pole s jedinou hodnotou, tou je zase ten řetězec a array_unique ho vyhodnotí samozřejmě jako jediný unikátní protože nemá s čím porovnávat. Jaká je teda hodnota (formát) $idpath[8]? |
||
Milkys Profil |
#7 · Zasláno: 12. 11. 2011, 23:48:34
Chro:
je to číslo, ta čárka je jen doplněná viz. #1 v 10.řádku pro lepší čitelnost a pochopení. |
||
Chro Profil |
#8 · Zasláno: 13. 11. 2011, 00:06:17
Milkys:
Takže, pokud v cyklu jen vypisuješ echem ty čísla na výstup nemáš s nima dále ve skriptu už možnost jak pracovat. Na začátek skriptu před cyklem si nadefinuj prázdnou proměnnou. <?php $pomocna = ''; A v cyklu do ní připojuj hodnoty. if ($hotid != 0) { $pomocna.= $hotid.', '; } Po skončení cyklu s $pomocna pracuj jak jsem ti radil výše a výsledek si zobraz třeba echem. |
||
Davex Profil |
#9 · Zasláno: 13. 11. 2011, 00:18:58
Nezkoušel jsem to, ale mělo by stačit uložit si čísla normálně do pole a po skončení cyklu použít
array_unique() .
<?php $xml = simplexml_load_file("soubor.xml"); $key = $xml->xpath("item"); $hotid = array(); foreach ($key as $item){ if ($item->neco == $key_nav) { $idpath = explode("/",$item->photos->photo); $hotid[] = $idpath[8]; //získám hotId, které je v 8. poli url fotografií } } if (!empty($hotid)) { echo implode(', ', array_unique($hotid)); } ?> |
||
Milkys Profil |
#10 · Zasláno: 13. 11. 2011, 09:22:38 · Upravil/a: Milkys
Davex
ano to je ono, takto jsem to potřeboval a je to funkční, jak jednoduché, děkuji. .... foreach ($key as $item){ if ($item->neco == $key_nav) { $idpath = explode("/",$item->photos->photo); if ($idpath[8] != 0) { $hotid[] = $idpath[8]; } } } if (!empty($hotid)) { echo implode('', array_unique($hotid)); } Chro Děkuji i za tvůj čas a snahu pomoci a hlavně trpělivost, až na tom s php budu lépe rád to někomu oplatím. Všem přeji hezkou neděli. |
||
Milkys Profil |
#11 · Zasláno: 14. 11. 2011, 11:22:21
Domníval jsem se, že to bude máček, protože už mi něco podobného funguje, ovšem tam mám dané jen jedno hotid a je to jednodušší. Takže ještě jednou Vás poprosím o podporu na téma související s výše uvedeným problémem.
Co když chci jednotlivé hodnoty (t.j. např: 25,26,29) postupně zpracovávat - dosadit do url. Zkoušel jsem si včera něco počíst o polích (ne o polích s obilím nebo jinými surovinami) vyzkoušel několik několik způsobů použití foreach (domnívám se, že to je to co potřebuji na to, aby to prošlo jednotlivé hodnoty polí), ovšem bez úspěchů. Podle mě tam dělá problém to implode, kde všechny hodnoty sloučím do jednoho pole. Prosím Vás dá se to nějak vyřešit. Děkuji za reakce. |
||
Kajman_ Profil * |
#12 · Zasláno: 14. 11. 2011, 12:43:26
Pokud chcete s hodnotami pracovat jako s polem, tak na to pole prohnané array_unique nevolejte implode.
|
||
Milkys Profil |
#13 · Zasláno: 14. 11. 2011, 16:02:01 · Upravil/a: Milkys
Kajman:
já v°l, mě to pořád vypisovalo Array, ale když jsem to zpracoval tak to vypíše počet foto z adresářů správně. Asi jsem si ukrojil trochu větší krajíc než na co mám. Fachčí to dobře po ř. kde je moje kontrolní echo $pocet_img.','; potom to zobrazí fotky jen z jedné složky a to té poslední (v řetězci čísel) nikoliv všech složek, které mám dočasně uloženy v $help[] resp. $help_pole (to je ten řetězec čísel). A co tím básník chtěl ríci? Toužím tedy po tom, aby se zobrazovaly foto ze všech příslušných složek ( postupně třeba od první nebo od poslední složky - to je jedno), jejichž názvy (čísla) jsou v $help[] resp. $help_pole. Doufám, že pro pochopení zápletky stačí část scriptu a snad jsem to dobře vysvětlil. Fotky počítám, abych potom ve finále mohl omezit zobrazení počtu fotek třeba jen na maximálně 10, aby se jich nenačítalo třeba 100 - t.j. nežádoucí. Co dělám prosím špatně? Je to vůbec proveditelné? Děkuji za schovívavost. //... $help[] = $idpath[8]; } } } if (!empty($help)) { $help_pole = array_unique($help); } foreach ($help_pole as $hotid){ //echo $hotid.','; //v tomto kontrolním bodu se mi ještě správně vypíše celý seznam názvů složek (čísla) if ($slozka = opendir("image/x/$hotid/1")) { while (false !== ($file = readdir($slozka))) { if ($file != "." && $file != "..") { $pocet_img++; } } closedir($slozka); } //echo $pocet_img.','; } if ($pocet_img > 3) { //echo $hotid; echo ' <div id="hlavicka"> <h1>Nabídka '.$key_nav.'</h1> <div class="marquee" id="mycrawler2">'; $slozka = "image/x/$hotid/1"; $obsah = scandir($slozka); // prochazeni polem obsah foreach($obsah as $soubor) { // pokud soubor neni . if($soubor != "."){ // pokud je soubor slozkou if(is_dir($slozka."/".$soubor)) { echo ''; } else { // a pokud je soubor obrazkem if(@getimagesize($slozka."/".$soubor)) { echo '<img style="margin-right:5px" src="image/x/'.$hotid.'/1/'.$soubor.'" height="200px" title="'.$key_nav.'" alt="'.$key_nav.' - fotogalerie" />'; } } } } //....atd. |
||
Časová prodleva: 14 let
|
0