Chybová hláška "Invalid argument supplied for foreach()" v PHP je bežný problém, s ktorým sa stretávajú začiatočníci aj skúsení programátori. Najčastejšie sa objavuje, keď sa funkcia foreach() pokúša iterovať cez premennú, ktorá nie je pole (array) alebo objekt, ktorý implementuje rozhranie Traversable. V tomto článku sa pozrieme na príčiny tejto chyby, ako ju diagnostikovať a ako ju efektívne opraviť. V kontexte webhostingu a obmedzení, ktoré môžu nastať, si ukážeme aj alternatívne riešenia.
Príčiny chyby
Funkcia foreach() v PHP očakáva, že dostane ako argument pole alebo objekt, cez ktorý bude iterovať. Ak jej predáme niečo iné, napríklad:
- NULL: Premenná nemá žiadnu hodnotu.
- boolean (TRUE/FALSE): Logická hodnota.
- integer / float: Číslo.
- string: Textový reťazec.
- Nedefinovanú premennú: Premenná, ktorá nebola inicializovaná.
PHP vyhodí chybu "Invalid argument supplied for foreach()". Dôvodom je, že foreach() nevie, ako iterovať cez tieto typy premenných.

Diagnostika problému
Prvým krokom pri riešení tejto chyby je identifikovať, ktorá premenná spôsobuje problém a prečo nemá očakávaný typ. Na to môžeme použiť funkcie var_dump() alebo gettype().
- var_dump($premenna): Vypíše typ premennej a jej hodnotu. To nám umožní zistiť, či je premenná NULL, boolean, string, alebo má iný neočakávaný typ.
- gettype($premenna): Vráti reťazec s názvom typu premennej (napr. "NULL", "boolean", "integer", "string", "array", "object").
Použitím týchto funkcií môžeme presne určiť, aký typ dáta sa nachádza v premennej, ktorá je argumentom funkcie foreach().

Riešenia a opravy
Keď už vieme, ktorá premenná spôsobuje problém a prečo, môžeme použiť niekoľko riešení:
1. Inicializácia premennej ako prázdne pole
Ak premenná môže byť niekedy NULL alebo nedefinovaná, môžeme ju inicializovať ako prázdne pole pred cyklom foreach():
$premenna = []; // Inicializácia ako prázdne poleforeach ($premenna as $element) { // ... kód cyklu ...}Týmto zabezpečíme, že foreach() vždy dostane pole, aj keď je prázdne.
2. Kontrola typu premennej pred cyklom
Môžeme použiť funkciu is_array() na overenie, či je premenná pole pred spustením cyklu foreach():
if (is_array($premenna)) { foreach ($premenna as $element) { // ... kód cyklu ... }} else { // ... kód pre prípad, že premenná nie je pole ...}3. Zabezpečenie, že funkcia vracia pole
Ak premenná pochádza z volania funkcie, uistite sa, že funkcia vždy vracia pole, aj keď je prázdne. Namiesto vrátenia NULL vráťte prázdne pole:
function ziskajData() { // ... kód funkcie ... if ($data_existuje) { return $data; } else { return []; // Vráti prázdne pole namiesto NULL }}$premenna = ziskajData();foreach ($premenna as $element) { // ... kód cyklu ...}4. Použitie iterátorov pre objekty
Ak chcete iterovať cez objekt, uistite sa, že implementuje rozhranie Traversable alebo použite metódy objektu na získanie poľa, cez ktoré môžete iterovať.
5. Explicitné pretypovanie
V niektorých prípadoch môže byť potrebné explicitne pretypovať premennú na pole pomocou (array). Toto by sa malo používať s opatrnosťou, pretože to môže viesť k neočakávaným výsledkom, ak premenná obsahuje iné dáta, ako tie, ktoré očakávate.
Špecifický prípad: Warning: glob copy() has been disabled for security reasons a Invalid argument supplied for foreach()
V užívateľom poskytnutom kontexte sa vyskytujú dve varovania:
Warning: glob copy() has been disabled for security reasons in /3w/wz.cz/a/autoshoponline/vscal/pages/listings.php on line 12Warning: Invalid argument supplied for foreach() in /3w/wz.cz/a/autoshoponline/vscal/pages/listings.php on line 12
Prvé varovanie naznačuje, že funkcia glob() bola zakázaná z bezpečnostných dôvodov. Funkcia glob() sa používa na vyhľadávanie súborov a adresárov zodpovedajúcich zadanému vzoru.
Riešenie pre zakázanú funkciu glob()
Keďže funkcia glob() je zakázaná, musíme nájsť alternatívne riešenie na získanie zoznamu súborov. Jednou z možností je použitie funkcií opendir(), readdir() a closedir() na manuálne prechádzanie adresárom a získanie zoznamu súborov.

Príklad:
<?php$dir = "/3w/wz.cz/a/autoshoponline/vscal/pages/"; // Adresár, ktorý chceme prejsť$files = []; // Pole pre uloženie zoznamu súborovif (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { // Preskočíme aktuálny adresár (.) a rodičovský adresár (..) if ($file != "." && $file != "..") { $files[] = $file; // Pridáme názov súboru do poľa } } closedir($dh); }} else { echo "Adresár neexistuje!";}// Teraz môžeme iterovať cez pole $files pomocou foreach()foreach ($files as $file) { echo "Súbor: " . $file . "<br>"; // ... ďalší kód ...}?>Vysvetlenie kódu:
- $dir: Definuje cestu k adresáru, ktorý chceme prejsť.
- $files = []: Inicializuje prázdne pole, do ktorého budeme ukladať názvy súborov.
- is_dir($dir): Overí, či zadaný adresár existuje.
- opendir($dir): Otvorí adresár pre čítanie.
- readdir($dh): Číta názov súboru z adresára. Vráti FALSE, ak dosiahneme koniec adresára.
- $file != "." && $file != "..": Preskočí aktuálny adresár (.) a rodičovský adresár (..).
- $files[] = $file: Pridá názov súboru do poľa $files.
- closedir($dh): Zatvorí adresár.
- foreach ($files as $file): Iteruje cez pole $files a spracováva každý súbor.
Nahradenie riadku 12 v listings.php
Predpokladáme, že riadok 12 v súbore listings.php obsahuje cyklus foreach(), ktorý používa výsledok funkcie glob(). Tento cyklus by sme mali nahradiť kódom, ktorý sme uviedli vyššie, pričom upravíme premennú $dir tak, aby ukazovala na správny adresár a kód vnútri cyklu foreach() tak, aby spracovával súbory podľa potrieb.
Day - 3 PHP Syntax, Variables, Data Types, Constants & Operators | PHP Tutorial for Beginners 2026💥
Dôležité upozornenia:
- Bezpečnosť: Pri manuálnom prechádzaní adresárov je dôležité dbať na bezpečnosť. Uistite sa, že filtrujete vstupné dáta a zabraňujete prístupu k citlivým súborom.
- Výkon: Prechádzanie adresárov pomocou opendir() a readdir() môže byť pomalšie ako použitie funkcie glob(). Ak máte veľký počet súborov v adresári, zvážte optimalizáciu kódu.
- Webhosting: V kontexte webhostingu, ako je WZ.cz, je dôležité si uvedomiť, že nemáte prístup k nastaveniam servera a nemôžete povoliť zakázané funkcie. Musíte sa spoliehať na alternatívne riešenia, ktoré sú dostupné v rámci daného prostredia.