Autor Zpráva
Milkys
Profil
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
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
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
Ř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
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
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
Chro:
je to číslo, ta čárka je jen doplněná viz. #1 v 10.řádku pro lepší čitelnost a pochopení.
Chro
Profil
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
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
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
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 *
Pokud chcete s hodnotami pracovat jako s polem, tak na to pole prohnané array_unique nevolejte implode.
Milkys
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0