Ik wil in een lijst van folders van elke folder de eerste afbeelding tonen. Het probleem is dat sommige folders geen afbeelding hebben als 1e bestand maar nog een folder.

Mijn arrays zien er nu zo uit:


Array
(
    [0] => .
    [1] => ..
    [2] => 20151113_152308.jpg
    [3] => 20160524_173033.jpg
    [4] => 20160810_100405.jpg
    [5] => 20160816_142932.jpg
    [6] => 20160817_135507.jpg
    [7] => 20170203_145901.jpg
    [8] => 20170203_151235.jpg
    [9] => Afbeelding-ifone-131.jpg
    [10] => Afbeelding-ifone-508.jpg
    [11] => Bestratingswerkzaamheden
    [12] => Mvc-161.jpg
    [13] => Rioleringswerkzaamheden
    [14] => SANY0016.jpg
    [15] => SANY0036.jpg
    [16] => SANY0060.jpg
    [17] => SANY0132.jpg
    [18] => SANY0133.jpg
    [19] => SANY0158.jpg
    [20] => SANY0159.jpg
    [21] => SANY0361.jpg
    [22] => Zeefwerkzaamheden
)
Array
(
    [0] => .
    [1] => ..
    [2] => Acceptatie afvalstoffen - bouwstoffen
    [3] => Afzet afvalstoffen - bouwstoffen
    [4] => Gronddepot,-kraan.jpg
    [5] => IMG_2596.jpg
    [6] => IMG_5258.jpg
    [7] => PA100991.jpg
    [8] => PA131006.jpg
    [9] => PA131009.jpg
    [10] => PA131015.jpg
    [11] => PA161034.jpg
    [12] => SANY0050.jpg
    [13] => Transport afvalstoffen - bouwstoffen
)
Array
(
    [0] => .
    [1] => ..
    [2] => Asbest inventarisatie
    [3] => Asfaltonderzoek
    [4] => Bodemonderzoek
    [5] => SANY0123.jpg
    [6] => SANY0695.jpg
    [7] => Saneringsontwerp
    [8] => Saneringsvarianten
)
Array
(
    [0] => .
    [1] => ..
    [2] => Asbestsanering
    [3] => Calamiteitensaneringen
    [4] => Grond sanering
    [5] => Sanering asbest in bodem
    [6] => Tank_sanering
    [7] => Vervoer bouwstoffen - afvalstoffen
)
Array
(
    [0] => .
    [1] => ..
    [2] => Aanleg vloeistofdichte voorzieningen
    [3] => Controle vloeistofdichte voorzieningen
    [4] => Herstel vloeistofdichte voorzieningen
    [5] => Oppervlakte reiniging
)


Alleen de 1e array heeft een afbeelding als 1e bestand. Ik wil bij de rest de folders overslaan en alleen maar een afbeelding tonen (als die er is). Hoe kan ik dat doen?

Dit is nu mijn loop:

<?PHP
foreach($directories as $image){
$firstfile = scandir($pad.'/'.$image);
echo $firstfile[2];
}
?>

Dat laat alleen bij de 1e een afbeelding zien en bij de rest folders.
Blijkbaar ga je er nu al vanuit dat de eerste 2 entries altijd een directory zijn ("." en ".."), da's ook niet helemaal zuiver. Gewoon er doorheen lo(o)pen, en na de eerste is_file() break-en.
<?php
foreach($directories as $image){
    $files = scandir($pad.'/'.$image);
    foreach($files as $file) if(is_file($pad . '/' . $file)){
      echo $file;
      break;
    }
}
?>
Rob Doemaarwat op 09/10/2019 14:05:02

Blijkbaar ga je er nu al vanuit dat de eerste 2 entries altijd een directory zijn ("." en ".."), da's ook niet helemaal zuiver. Gewoon er doorheen lo(o)pen, en na de eerste is_file() break-en.
<?php
foreach($directories as $image){
    $files = scandir($pad.'/'.$image);
    foreach($files as $file) if(is_file($pad . '/' . $file)){
      echo $file;
      break;
    }
}
?>


Bovenstaande toonde niets, ik heb nu de punten uit de array gefilterd en het iets anders opgeschreven:


foreach($directories as $image){
	$files = array_diff(scandir($pad.$image), array('.', '..', 'index.html'));

	foreach($files as $file){
		if(!is_dir($file)){
			echo $file.'<br>';
			break;
		}
	}
}


Maar dit geeft me nog steeds folders, hoe kan dat als ik erop check of het geen folder is?

Dit is het resultaat wat ik krijg:


20151113_152308.jpg
Acceptatie afvalstoffen - bouwstoffen
Asbest inventarisatie
Asbestsanering
Aanleg vloeistofdichte voorzieningen
Volgens mij zou Rob's methode moeten werken, maar ik heb het idee dat het met de accolades niet lekker loopt?

<?php
foreach($directories as $image){
$files = scandir($pad.'/'.$image);
foreach($files as $file) {
if(is_file($pad . '/' . $file)){
echo $file;
break;
}
}
}
?>
En moet je ook niet de recursie in indien mappen genest zijn? Mogelijk wil je van diepere directories ook een eerste afbeelding?
Bovenstaand laat ook niks zien helaas.

Thomas van den Heuvel op 09/10/2019 16:10:23

En moet je ook niet de recursie in indien mappen genest zijn? Mogelijk wil je van diepere directories ook een eerste afbeelding?


Ja lang verhaal maar dat werkt al, de submappen komen op een andere pagina en gaan altijd maar 1 niveau diep dus daar is de eerste waarde in de array sowieso altijd een file. Deze pagina staat er los van en toont alleen de hoofdmappen.
O, wacht, die $image is natuurlijk de naam van de sub-dir, dus die moet ook in het pad van je is_file():
<?php
foreach($directories as $image){
    $files = scandir($pad.'/'.$image);
    foreach($files as $file){
//onderstaande evt. gebruiken voor testen/debuggen
//      print($pad . '/' . $image . '/' . $file . "\n");
      if(is_file($pad . '/' . $image . '/' . $file)){
        echo $file;
        break;
      }
    }
}
?>

@Ariën: De accolades klopten wel, maar ik ben er een beetje "allergisch" voor. Ik zou bovenstaande dus gewoon schrijven als:
<?php
foreach($directories as $image) foreach(scandir($pad.'/'.$image) as $file) if(is_file($pad . '/' . $image . '/' . $file)){
  echo $file;
  break;
}
?>

Ik weet het, hier is niet iedereen gecharmeerd van, maar ik type altijd maar gewoon door tot ik echt een accolade nodig heb (ivm multi-line statement daarna).
Het "probleem" daarbij is wel dat elke keer dat je (of anderen) daarmee geconfronteerd wordt je geneigd bent om hier dan over na te denken of ze bewust zijn weggelaten of toch per ongeluk zijn vergeten. Als je gewoon overal consequent accolades gebruikt hoef je dat niet te doen. Minder is niet per definitie beter :). Leesbaarheid is ook een ding.
Thanks ik heb het voor elkaar gekregen met bovenstaande hulp.

Reageren