Autor Zpráva
Z-a-p
Profil *
Zdravím,
mohli byste mi někdo prosím poradit, proč kód níže nic nevypíše? Děkuji.

function files() {
	$files = scandir("/data");
	foreach ($files as $file) {
		return $file;
	}
}

echo files();
__construct
Profil
Asi pretože to máš rozbité.
Z-a-p
Profil *
Nevím, co je nepochopitelné na mém dotazu. Funkce by měla vracet obsah adresáře, případně ho potom vytisknout, ale tento kód mi nic nevrátí. Pokud místo return ve funkci dam echo, tak je vše v pořádku.
Joker
Profil
Z-a-p:
proč kód níže nic nevypíše?
Více možností. Tipnul bych, že v kořenovém adresáři serveru není adresář data, případně uživatel pod kterým skript běží tam ani nemá přístup.

Jinak funkce files() nedává moc smysl.
Přečte seznam souborů z adresáře "data" v kořenovém adresáři (což, pokud to server nepřemapuje, bude kořenový adresář systému souborů na serveru) a vrátí to první z nich (což bývá obvykle aktuální adresář, ".")
Z-a-p
Profil *
Joker:
Více možností. Tipnul bych, že v kořenovém adresáři serveru není adresář data, případně uživatel pod kterým skript běží tam ani nemá přístup.
Nevypíše to nic, i když tam dam jakýkoliv adresář. Jako funkci to dělam proto, že pokud to nevypíše soubor, který odpovídá podmínce, tak se funkce volá rekurzivně. Ovšem výsledky scandir nemůžu porovnávat, když mi to nic nevrací.
Joker
Profil
Z-a-p:
Ještě jednou: Tak jak je ta funkce napsaná nevrátí buď nic (pokud selže scandir), nebo vrátí první položku v adresáři, což většinou bývá tečka.

Mimochodem, to „nic to nevypíše“- nevypíše to čistě náhodou jednu tečku? Jestli ano, tak to „funguje“ tak, jak je to naprogramované.
Segi_L
Profil
Z-a-p:
Mne to funguje presne tak, jak to máš naprogramované jen místo
'/data' 
musím dať
'data/'
Z-a-p
Profil *
Joker:
Ano, tak jak jsem to mam naprogramované to vrací jen tečku. Já chci vrátit všechen obsah adresáře ale. Jakto, že foreach vrátí jen první záznam?
Joker
Profil
Z-a-p:
Jakto, že foreach vrátí jen první záznam?
Protože to tam je tak naprogramované. Uvnitř foreach je return, takže na prvním prvku ta funkce skončí (vrátí první prvek).
Co by ta funkce měla dělat?

Aby to vrátilo všechny záznamy, měly by se asi ukládat do pole a to potom vrátit. Ovšem pak to bude dělat to samé, co samotné scandir.
Z-a-p
Profil *
Joker:
Funkce by měla prohledat složku a rekurzivně podsložky. Pokud narazí na složku, která je uložena v proměnné, tak vrátí složku i s její cestou. Ve finále funkce vypadá takto:

function slozka($slozka, $dir) {
	$files = scandir($dir);
	foreach ($files as $file) {
		if (is_dir($dir.$file) & $file != "." & $files != "..") {	
			if ($slozka == $file) {
				return $dir.$file;
			}
			slozka($slozka, $dir.$file."/");
		}
	}
}


$slozka je složka, která se porovnává se záznamy v poli
$dir je složka, která se skenuje

Toto mi ale nevrátí absolutně nic, ani tečku.
Segi_L
Profil
To že ti to nevrati ani tečku tak to je správne. Máš to totiž v podmienke.
Skus popremýšlať na riadku č.8
Z-a-p
Profil *
Nic mě nenapadá, protože pokud místo vracení to necham vytisknout, tak funkce funguje tak jak má. Co máš na mysli s řádkem č. 8?
Joker
Profil
Z-a-p:
Ještě jednou, příkaz return ukončí zpracování funkce a vrátí danou hodnotu (ale sám o sobě ji nevypíše). To jsou ale opravdu základy.

Předpokládám, že výpisy jednotlivých adresářů by se měly akumulovat do nějaké proměnné a ta by se měla na konci vrátit.
Segi_L
Profil
Z-a-p:
Funkce() ná 2 rozne funkce.
Bud niečo udelá a vrátí nejaku hodnotu a tá sa uloží pre dalšie spracovanie.
function vypis()
{
    return 10;
}
$vypis = vypis();

Alebo proste len niečo vykoná bez toho, aby niečo vrátila.
function vypis()
{
    echo "10";
}
vypis();

Čo keď hľadaný adresár najdeš až po 3. volaní
slozka($slozka, $dir.$file."/");
jak zajistíš aby návratovú hodnotu vracalo i ostatných 2 funkcí volaných pred 3.
Volám 1. - neplní podmienku
----Volám 2. - neplní podmienku
--------Volám 3. - našiel som -> vraciam hodnotu
----vratil som sa do 2. a čo teraz?
Z-a-p
Profil *
Joker:
Ještě jednou, příkaz return ukončí zpracování funkce a vrátí danou hodnotu (ale sám o sobě ji nevypíše). To jsou ale opravdu základy.
vrácenou hodnotu ukládám do proměnné jak psal níže Segi_L. Ovšem pořád je ta proměnná prázdná.

Segi_L:
pokud najde, tak vrátí hodnotu a to je vše. Z funkcí, které neprojdou podmínkou nechci hodnotu vracet. Prakticky jde o to zjistit, jakou cestu má adresář v proměnné $slozka od rootu $dir.
Segi_L
Profil
Tak co? Už si prišiel na to kde je pes zakopaný? Ked nie tak skus toto
function slozka($slozka, $dir) {
    $cesta = '';
    $files = @scandir($dir);
    foreach ($files as $file) {
        if (@is_dir($dir.$file) & $file != "." & $file != "..") {
            if ($slozka == $file) {
                return  $dir.$file;           
            }
            $cesta = slozka($slozka, $dir.$file."/");
            if ($cesta)return $cesta;
        }
    }
    return $cesta;
}

i keď podľa tvojej poslednej odpovedi ti to funguje vlastne tak jak chceš. I ked je v tom paradox.
Z-a-p
Profil *
Segi_L:
ta moje funkce funguje jen v případě, že použiju print, nebo echo. Pokud použiju return, tak to nic nevrátí. Zkusim tvoji variantu ještě.
Z-a-p
Profil *
Segi_L:
tak ta tvoje funkce funguje, děkuju. Přiznam se, že nechápu, proč moje nevrátí hodnotu. Myslíš, že bys mi mohl trochu nastínit v čem jsem udělal vlastně chybu a v čem je ten háček?
Segi_L
Profil
Práve v tom riadku 8 tvojej povodnej funkcie.
Ty si sice volal rekurzne, ale vysledok z nej si uz nikde neulozil a pri ukonceni rekurze nepredal do predcházajucej rekurze.
takze ja som dal
$cesta = slozka($slozka, $dir.$file."/");

a pokial bola naplnená tak to znamenalo, ze volaná funkce vrátila hodnotu, takze ja tuto samu hodnotu som zase vratil.
if ($cesta)return $cesta;
Z-a-p
Profil *
Jasný, chápu. Děkuji za tvoji pomoc a čas.
Joker
Profil
Z-a-p:
vrácenou hodnotu ukládám do proměnné
Jenže ta funkce nic nevrátila, protože se neukládalo uvnitř. Přesně to změnil Segi_L.

ad Segi_L, dvě poznámky:
- Potlačení chybových zpráv zavináčem se nedoporučuje používat.
- (to je i v původním kódu) ad řádek 5, připomínám, že operátor & je bitový AND a logický součin (podmínka „a zároveň“) je &&. V tomhle konkrétním případě sice funguje obojí stejně, ale může to někoho zmást.

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: