Gennemlæs et directory og tæl forekomster...

Hvis du skulle lave et gennemløb af et directory på serveren som eks. har følgende indhold:
1.jpg
2.jpg
2_1.jpg
2_2.jpg
3.jpg
.
.
.
100.jpg
100_1.jpg
Filnavnene er struktureret således at de starter med et nr før underscore som er hovedbillednr, nummeret efter underscore er et underkategorinr.
- og du vil tælle antal filer inden for hvert billede, altså:
billed 1 findes i 1 udgave
billed 2 findes i 3 udgaver
billed 3 findes i 2 udgaver
.
.
.
billed 100 findes i 2 udgaver
Hvordan ville du så gøre det i PHP?
Mvh. Jens Peter

Jeg er selv kommet frem til følgende mulige løsning - ikke køn og garanteret ikke den simpleste og effektive.... men "it does the job!"
<?php
include("app.php");
$app = new minAwesomeApp;
function listDirs($where){
$itemHandler=opendir($where);
$i=0;
$liste = array();
while(($item=readdir($itemHandler)) !== false){
if(substr($item, 0, 1)!="."){
if(is_dir($item)){
echo "Directory";
}else{
if(((substr($item, 1, 1)=="_")) or ((substr($item, 1, 1)==".")))
{
$liste[substr($item, 0, 1)]++;
}
else{ if(((substr($item, 2, 1)=="_")) or ((substr($item, 2, 1)==".")))
{
$liste[substr($item, 0, 2)]++;
}
else{ if(((substr($item, 3, 1)=="_")) or ((substr($item, 3, 1)==".")))
{
$liste[substr($item, 0, 3)]++;
}
}}}
$i++;
}
}
ksort($liste);
foreach($liste as $x => $x_value) {
echo "<br>Billednr=" . $x . " findes i " . $x_value . " udgaver.";
}
}
?>
<?php
listDirs("billeder/");
?>

Med ovenstående in mente har jeg forsøgt at lave en update af et felt på en tabel med antal udgaver af hvert billede....
Jeg har inde i min for each tilføjet
$app->DatabaseUpdate("billeder", array('antalBilleder'), array($x_value), "WHERE gruppeId = 2 AND billedNr = $x");
MEN jeg får følgende fejl:
Fatal error: Uncaught Error: Call to a member function DatabaseUpdate() on null.....
Nogen der kan sige hvad jeg gør forkert...?
Mvh. Jens Peter

#2
Dit problem er noget der kaldes for "scopes". (Husk i fremtiden at lave en ny forumtråd, så andre nemmere kan finde svar også. )
Lidt let fortalt, så handler det om hvad for nogle funktioner der kan se andre objekter og funktioner i koden. Fejlen med "on null" med din "DatabaseUpdate" function, betyder at objektet $app er tomt. Her har du et eksempel hvor det virker:
class.php fil:
<?php
// Opsætter fejlrappotering til alt pånær "notice"-beskeder
error_reporting(E_ALL ^ E_NOTICE);
// Definerer at vi gerne vil vise fejlbeskeder, sæt til 0 for at skjule fejlbeskeder
ini_set("display_errors", 1);
class minClass {
public function minFunction() {
echo "<p>Kaldt min funktion inde i min class.php fil.</p>";
}
}
?>
index.php fil:
<?php
// Inkludere vores class.php fil
include('class.php');
// Initialize/start minClass object og sæt det til en variabel ($min_class)
$min_class = new minClass;
// Kalder vores $min_class object direkte efter at vi har sat den
$min_class->minFunction();
// En funktion i vores "hoved PHP fil" med et enkelt argument
function ikkeClassFunction($parsed_class) {
echo "<p>Prøver at kalde min class inde fra en function.</p>";
$parsed_class->minFunction();
}
// Starter ikkeClassFunction med $min_class som argument
ikkeClassFunction($min_class);
?>
I det overstående simplificeret eksempel, kan du se at vi først henter vores class.php fil og derefter sætter vores minClass class ind i vores $min_class variable.
Så kalder vi den som normalt, hvor det virker - for det er inde for dens "scope".
Men nu laver jeg en funktion som vi kalder senere i vores PHP kode på index.php. Og giver vores function et argument den kan tage imod. (Variablen $parsed_class.)
Så kalder jeg min nye funktion med $min_class som dens argument, så vi simpelthen giver den "objektet".
Jeg håber at det hele gav mening. Igen, grunden til at $app->DatabaseUpdate() ikke fungere, er fordi den ingen reference har til objektet $app. Den ser det simpelthen ikke, fordi du er inde i en funktion. Så vi bliver nød til at sende objektet $app, med over i funktionen for at kunne tilgå den.
Redigeret af
@dhh
d. 03.11.2016 kl. 11:20 Med venlige hilsner
Daniel H. Hemmingsen (@dhh)