vkladanie viacerých súborov cez include

Programovacie jazyky, rady, poradňa...
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

vkladanie viacerých súborov cez include

Príspevok od používateľa Mato.y »

čafte,

ako možem nastaviť funkciu include (PHP) tak, aby načítavalo všetky súbory v istom priečinku zostupne?

Pre bližšiu ukážku: mám tam súbory

text001.dat
text002.dat
text003.dat
text004.dat
text005.dat

a aby sa všetky vložili do stránky, ale v poradí:

text005.dat
text004.dat
text003.dat
text002.dat
text001.dat

ďk
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Možno viac zložitý skript, ako by si chcel (ak budeš chcieť, môžem ho zjednodušiť), ale môžeš mu dať ako parameter masku, podľa ktorej vyfiltruje požadované súbory (je to vhodné napr. ak v tom adresári sú aj iné súbory):

Kód: Vybrať všetko

<?php

function s2p($mask)
{
	$translate = Array(
		"." => "\\.",
		"*" => ".*",
		"?" => ".?",
		"+" => "\\+",
		"[" => "\\[",
		"]" => "\\]",
		"(" => "\\(",
		")" => "\\)",
		"{" => "\\{",
		"}" => "\\}",
		"^" => "\\^",
		"\$" => "\\\$",
		"\\" => "\\\\",
	);
	return "/^".strtr($mask, $translate)."$/";
}

function include_files($dir, $mask)
{
	$mask = s2p($mask);

	$files = array();

	if (!preg_match("/\/$/", $dir)) {
		$dir .= "/";
	}

	if (is_dir($dir)) {
		if ($dh = opendir($dir)) {
			while (($filename = readdir($dh)) !== false) {
				if ($filename != "." && $filename != ".." && is_file($dir . $filename) && preg_match($mask, $filename))
					$files[] = $dir . $filename;
			}
			closedir($dh);
		}
	}
	rsort($files);
	foreach ($files as $filename) {
		include($filename);
	}
}

include_files("files", "text*.txt");
?>
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

a este nieco... ze tu mam skriptik na pocitanie:

Kód: Vybrať všetko

$handle = fopen("../files/number.dat","a");
fclose($handle);
$handle = fopen("../files/number.dat","r+");
$kolik = fread($handle,10);
++$kolik;
rewind($handle);
fwrite($handle,$kolik);
fclose($handle);
a ono to zacne pocitat od jednociferneho cisla neak takto: "1" a pod.

A ked chcem aby to zacalo pocitat TROJCIFERNYM cislom neak takto: "001" a pod. da sa taqe neco? dakujem :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

To číslo 001 musíš mať v tom súbore number.dat, alebo stačí, keď bude v súbore v klasickom tvare a len pri použití tam budú tri medzery.
Ak by si chcel, aby to číslo bolo v tom tvare aj v tom súbore, bolo by to trochu zložitejšie (napr. ak by tam bolo číslo 012 php by si myslelo, že je to číslo v osmičkovej sústave).
Ak ti stačí, aby bol ten tvar pri používaní, použi funkciu sprintf. Napr.:

Kód: Vybrať všetko

$filename = sprintf("text%03d.txt", $kolik);
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

no proste poviem to takto:

ja som mal hento "pocitadlo" na vytvaranie tych suborov text(cislo).txt aby sa mi subory neopakovali.

priklad:
text1.txt
text2.txt
...
text10.txt
a pod.

vsetko funguje, akurat nastal problem pri hromadnom include (ten co si sem dal aj ty), a to bralo cislo 10 v tomto pripade ako mensie nez 2 a vacsie nez 1. Preto som sa pytal na to pocitadlo. Dalo by sa to neak logicky vyriesit? dak.

PS: za ten hromadny include som uz k+ poslal :p
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

V podstate sú dva jednoduché spôsoby, ako to urobiť.
1. budeš generovať názvy tých súborov pomocou tej funkcie sprintf (a budeš tam mať čísla v tvare 001, 002...)
2. ak by tie názvy súborov mali číslo na začiatku (a nie v strede), tak by sa vo funkcii rsort dal použiť parameter SORT_NUMERIC (a fungovali by to ako potrebuješ)

Ďalšia možnosť je odstrihnúť začiatok reťazca a porovnávať len tie číselné časti (ale to by si musel upravovať vždy, keby si chcel zmeniť názvy tých súborov).
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

DAKUJEM!!!

chrono velmi si mi pomohol! :)
vidiet ze si v tom velmi zbehli
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Vlastne sa to dá vyriešiť ešte aj inak. Nahraď ten príkaz rsort týmto: natsort($files);
$files = array_reverse($files);
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

chrono napísal:

Kód: Vybrať všetko

<?php

function s2p($mask)
{
	$translate = Array(
		"." => "\\.",
		"*" => ".*",
		"?" => ".?",
		"+" => "\\+",
		"[" => "\\[",
		"]" => "\\]",
		"(" => "\\(",
		")" => "\\)",
		"{" => "\\{",
		"}" => "\\}",
		"^" => "\\^",
		"\$" => "\\\$",
		"\" => "\\\",
	);
	return "/^".strtr($mask, $translate)."$/";
}

function include_files($dir, $mask)
{
	$mask = s2p($mask);

	$files = array();

	if (!preg_match("/\/$/", $dir)) {
		$dir .= "/";
	}

	if (is_dir($dir)) {
		if ($dh = opendir($dir)) {
			while (($filename = readdir($dh)) !== false) {
				if ($filename != "." && $filename != ".." && is_file($dir . $filename) && preg_match($mask, $filename))
					$files[] = $dir . $filename;
			}
			closedir($dh);
		}
	}
	rsort($files);
	foreach ($files as $filename) {
		include($filename);
	}
}

include_files("files", "text*.txt");
?>
A dalo by sa toto troska prerobit aby sa to neincludovalo, ale nacitalo do premennej? :roll:
turtlak69
Guru
Guru
Príspevky: 2896
Registrovaný: 10 máj 2007, 15:58
Bydlisko: /dev/null

Príspevok od používateľa turtlak69 »

ja by som to spravil takto:
nazvy suborov by boli blablabla1.dat, blablabla2.dat, .... , blablabla999.dat
zistil by som pocet suborov v priecinku
potom by som includoval pomocou cyklu:

for ($a=0; $a<=$pocet_suborov; $a++)
{
include ("blablabla$a.dat");
}
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ak by tam boli iba súbory, ktoré sa majú načítať a zároveň by boli číslované spojito (čo by ale znamenalo, že pri vymazaní nejakého súboru by sa to muselo celé prečíslovať), tak by to fungovalo.
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

RE: A dalo by sa toto troska prerobit aby sa to neincludovalo, ale nacitalo do premennej? :?:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Mato.y napísal:RE: A dalo by sa toto troska prerobit aby sa to neincludovalo, ale nacitalo do premennej? :?:
Myslíš to, čo tu rieši geoge? http://www.hojko.com/nacitanie-do-array ... 72936.html
Mato.y
Light Expert
Light Expert
Príspevky: 40
Registrovaný: 23 jan 2007, 15:41

Príspevok od používateľa Mato.y »

Ano snazim sa mu troska pomoct :)
turtlak69
Guru
Guru
Príspevky: 2896
Registrovaný: 10 máj 2007, 15:58
Bydlisko: /dev/null

Príspevok od používateľa turtlak69 »

chrono napísal:Ak by tam boli iba súbory, ktoré sa majú načítať a zároveň by boli číslované spojito (čo by ale znamenalo, že pri vymazaní nejakého súboru by sa to muselo celé prečíslovať), tak by to fungovalo.
presne tak :) alebo spravit skript, ktory by to fixol a pomocou crona ho spustat kazdu hodinu napriklad. podla toho ci by sa mazali tie subory dako casto :) alebo by sa skript spustil pred vytvorenim suboru :) ale keby sa mazali tie subory, tak by to nebolo moc nefektivne. to uz radsej zlozitejsi skript (tam ten hore)
Napísať odpoveď