Wątek przeniesiony 2014-08-18 18:42 z PHP przez dzek69.

niewłaściwe działanie funkcji strpos

0

Witam.
Mam problem z prawidłowym działaniem aplikacji, której zadaniem jest wypisanie wszystkich plików (szablon, plik .txt) w folderze (pętla while), a podczas każdego obiegu pętli, sczytywana jest nazwa (odpowiednio sformatowana), następnie otwierany jest inny plik txt (lista linków) i na podstawie nazwy znajdowana odpowiednia linijka oraz wklejana na miejsce starego w szablonie.
O ile większość jest jest już zrobiona, o tyle ugrzązłem od kilku dni nad prawidłowym działaniem funkcji strpos, która tylko za pierwszym wywołaniem działa tak jak powinna.
Jestem początkującym w temacie, jednak poproszę o skupienie się nad rozwiązaniem problemu - pewnie coś niewielkiego, ale Ja już nie mam siły :P
Z góry dzięki za pomoc.

$alinks = array('D:\\testing\\linki1.txt',
		'D:\\testing\\linki2.txt',
		'D:\\testing\\linki3.txt');	

 if($dh = opendir(tbf)){		// otwiera folder tbf
		while(($file = readdir($dh)) !== false){	// wypisuje nazwy plikow
			if(($file !== '.') && ($file !== '..')){ //pomija . i ..
				// zczytanie nazwy pierwszego pliku w folderze
				$exp = explode('.',$file); //dzieli nazwe pliku
				//print_r ($exp);
				//echo '</br>';
				if($dindex = array_search('2014',$exp));	// sprawdza czy w nazwie znajduje sie data 2014...			
						elseif($dindex = array_search('2013',$exp));
							elseif($dindex = array_search('2012',$exp));
								elseif($dindex = array_search('2011',$exp));
									elseif($dindex = array_search('2010',$exp));
										elseif($dindex = array_search('2009',$exp));
											elseif($dindex = array_search('2008',$exp));
												elseif($dindex = array_search('2007',$exp));
													elseif($dindex = array_search('2006',$exp));
														elseif($dindex = array_search('2005',$exp));
															elseif($dindex = array_search('2004',$exp));
																elseif($dindex = array_search('2003',$exp));
																	elseif($dindex = array_search('2002',$exp));
																		elseif($dindex = array_search('2001',$exp));
																			elseif($dindex = array_search('2000',$exp));
																				elseif($dindex = array_search('1999',$exp));
																					//... jesli znajdzie ktoras z dat, 
																					//to zapisuje jej klucz w tablicy dindex
						echo $dindex.' : dindex</br>';													
						for($i = 0; $i <= $dindex; $i++){	//zczytuje nazwe oraz rok do tablicy ititle
							$ititle[$i] = $exp[$i];
							echo $ititle[$i].' : ititle</br>';
						}
						
						$filename = implode('.',$ititle);	//filename przechowuje tytul i rok
						unset($ititle);
						echo $filename.' : filename</br>';
						
						
				for($x = 0; $x <= count($alinks)-1; $x++){ // petla ogolna dla kazdego pliku z linkami				
					if(is_file($alinks[$x])){	// sprawdza czy taki plik z linkami sie znajduje					
						if($ffh = fopen($alinks[$x],'r')){ // otwiera plik z linkami	
							while ($haystack = fgets($ffh)){ 	// zaczyna pobierac linie textu
								//echo 'Pobiera linie textu : '.$haystack.'</br>';
								if(strpos($haystack,$filename) !== FALSE){ // jesli napotka tytul,										
									$newlink [$x] = $haystack;	// to zapisuje go w tablicy 
									echo $newlink[$x].' : NEWLINK!</br>';									
								}					
							}fclose($ffh);	
							
						}else{
							echo 'Nie udalo sie otworzyc pliku: '.$alinks[$x].'</br>';
						}
			
					}else{
						echo '</br>Nie ma takiego pliku: '.$alinks[$x].'</br>';
					}								
				}	
				// wkleja nowy link do szablonu 
				/*if($fgc = file_get_contents('D:\\testing\\tbf\\'.$file)){
						$fgc = str_replace('[code]{links_1}[/code]','[code]'.$newlink[0].'[/code]', $fgc);
						file_put_contents('D:\\testing\\tbf\\'.$file,$fgc);
						$fgc = str_replace('[code]{links_2}[/code]','[code]'.$newlink[1].'[/code]', $fgc);
						file_put_contents('D:\\testing\\tbf\\'.$file,$fgc);	
						$fgc = str_replace('[code]{links_3}[/code]','[code]'.$newlink[2].'[/code]', $fgc);
						file_put_contents('D:\\testing\\tbf\\'.$file,$fgc);	
					}
					*/
			} // KONIEC IF'a	
		}
		closedir($dh);	
	}
1
  1. Popraw kolorowanie kodu
  2. popraw kod, bo boli.

O samym problemie mało napisałeś - co to znaczy ze nie działa jak powinna?

0

" tylko za pierwszym wywołaniem działa tak jak powinna."
Czyli znajduje odpowiednie wpisy w plikach z lista linkow tylko dla pierwszego pliku (szablonu - nazwy), zamiast dla wszystkich znajdujących się aktualnie w folderze.

0

czyli nie za pierwszym wywołaniem tylko dla pierwszego pliku. bo wywołań masz w cholerę. Poza tym ja baaardzo nie lubię konstrukcji if($zmienna = coś) zmień na if(($zmienna = coś)) i debuguj, bo zagnieżdżenie masz tam takie jakby dół kopać. 8 poziomów zagnieżdżenia to już patologia ;)

Edit:
Napisałem w PM to napisze i tu: rozbij problem na funkcje żeby uniknąc takiego zagnieżdżenia, przez to kod będzie czytelniejszy i będziesz mógł debugować problem na mniejszym zakresie możliwości popełnienia błędu.

0

Tak naprawdę to tam nie ma zbyt wiele do rozbijania, bo jedynie kilka czynności się wykonuje - wypisanie plików w folderze (szablonów), zapisanie do zmiennej sformatowanej nazwy pliku, otworzenie 3 plików (lista z linkami) i znalezienie w każdym z nich odpowiedniej linijki z nazwą oraz wklejenie do pliku w kroku pierwszym. A całość powtarza się dla każdego pliku typu szablon.
Przez kilka ostatnich dni wszystko odpalałem z echo, żeby sprawdzić do którego momentu wykonywanie dochodzi i okazuje się, że dla drugiego i każdego kolejnego obrotu pętli, ta funkcja strpos już przestaje działać. Co dziwne cała pętla for w której to znajduje się strpos, działa bez zarzutu dostarczając odpowiednich rezultatów, ale już ta linijka:
"if(strpos($haystack,$filename) !== FALSE)" się sypie :-/
Ktoś ma jeszcze jakieś sugestie ?

0

Nie jest możliwe żeby źle działało. Jeśli $haystack == $filename to musi zwrócić 0. Jeśli $haystack zawiera $filename to musi zwrócić indeks. jeśli $haystack nie ma w ogóle w sobie $filename to zwrócić musi FALSE. Nie może się "sypać".

0

Hmm, zarówno $haystack jak i $filename są, jednak strpos nie znajduje jednego w drugim, co ciekawe gdy usunąłem pierwszy plik z listy, teraz również nie może znaleźć następnego w kolejce. Odpowiedź jest blisko, ale Ja jestem już skołowany :P

EDITED:
Bueeee, bueee, bueeeeee ;-(
... kilka dni spędzonych nad jednym problemem, kilkanaście kaw wypitych i nocy zarwanych. Oczy podkrążone i myśli depresyjne, a rozwiązaniem okazało się być wstawienie jednej litery - 'i', aby różnica między małymi i dużymi literami została zignorowana.
Pozdro dla pomagających i czytających.

0

Jezu, jak dobrze, że nie musisz brać pod uwagę dat 2014-1950 np. bo byś do dziś robił te zagnieżdżenia...

O pętli FOR uczą chyba na drugiej lekcji każdego kursu php.

(A potem się dziwić, że się z programistów PHP śmieją - to nawet nienaturalnie wygląda i już na tym etapie powinieneś sam dojść do wniosku, że coś jest nie tak i tak to być nie może. Przenoszę wątek.)

0

Tam nawet nie trzeba pętli for szkoda męczyć kompa wystarczy przecastować $exp na integera if >=1999

1 użytkowników online, w tym zalogowanych: 0, gości: 1