Werte aus Arrays in ein neues schreiben lassen

Liebe/-r Experte/-in,

entschuldige wenn ich bei der Erklärung nicht die richtigen Begriffe werwende, da ich PHP Einsteiger bin.
Hoffe Du kannst meiner Ausführung folgen.

Ich lasse mit folgenden PHP-Code aus einem Verzeichnis Bilder bzw. dateinamen einlesen, und nach einem bestimmten Muster sortieren.

<?php $dir = "photo";<br />if (is\_dir($dir)) {
if ($dh = opendir($dir)) {
while (($filename2 = readdir($dh)) !== false) {
if($filename2 != "." && $filename2 != ".." ) $files2[] = $filename2;
}
$aktuell=str\_replace(' ','',date("m Y"));
$vergangen=str\_replace(' ','',date("m Y", strtotime("-1 month -1 year")));

foreach ($files2 as $con1) {
 $in[] = array(
 'rest\_1' =\> substr ( $con1, 6, 4 ),
 'pre\_1' =\> substr ( $con1, 4, 2 ),
 'test\_1' =\> $con1
 );
}

foreach($in as $key =\> $row)
{
 $array\_rest\_1[$key] = $row['rest\_1'];
 $array\_pre\_1[$key] = $row['pre\_1'];
}

array\_multisort($array\_rest\_1,SORT\_DESC,$array\_pre\_1,SORT\_DESC,$in);

Dann lasse ich das Array anzeigen.
Das sieht so aus:

array(29) {
[0]=>
array(3) {
[„rest_1“]=>
string(4) „2013“
[„pre_1“]=>
string(2) „04“
[„test_1“]=>
string(14) „ABC_042013.png“
}

usw. wobei alle Dateinamen nach dem Muster „ABC_MMYYYY.png“

MM = Monat
YYYY = Jahr

aufgebaut sind. und von „ABC_042013.png“ bis „ABC_122010.png“ reichen.

Nun mochte ich alle Werte aus den Schlüsseln „test_1“ aus den unter Arrays vom Array $in in ein neues Array schreiben lassen.

So etwa:

Array
(
 [1] =\> ABC\_042013.png
 [2] =\> ABC\_032013.png
 [3] =\> ABC\_022013.png
)

usw.

Wie setze ich das um ?

Bitte beim erklären daran denken Ich bin PHP-Newbie.

Für deine Hilfe Danke ich im voraus.
Andreas

Hallo,

Dazu schreibst du in deine foreach schleife einfach:

$fileArray[] = $row[‚test_1‘];

Viele grüße,
Till

Liebe/-r Experte/-in,

entschuldige wenn ich bei der Erklärung nicht die richtigen
Begriffe werwende, da ich PHP Einsteiger bin.
Hoffe Du kannst meiner Ausführung folgen.

Ich lasse mit folgenden PHP-Code aus einem Verzeichnis Bilder
bzw. dateinamen einlesen, und nach einem bestimmten Muster
sortieren.

<?php :blush:dir = "photo";
if (is\_dir($dir)) { if ($dh = opendir($dir)) { while (($filename2 = readdir($dh)) !== false) { if($filename2 != "." && $filename2 != ".." ) $files2[] = $filename2; } $aktuell=str\_replace(' ','',date("m Y")); $vergangen=str\_replace(' ','',date("m Y", strtotime("-1 month -1 year"))); foreach ($files2 as $con1) { $in[] = array( 'rest\_1' =\> substr ( $con1, 6, 4 ), 'pre\_1' =\> substr ( $con1, 4, 2 ), 'test\_1' =\> $con1 ); } foreach($in as $key =\> $row) { $array\_rest\_1[$key] = $row['rest\_1']; $array\_pre\_1[$key] = $row['pre\_1']; } array\_multisort($array\_rest\_1,SORT\_DESC,$array\_pre\_1,SORT\_DESC, $in); Dann lasse ich das Array anzeigen. Das sieht so aus: > array(29) { > [0]=\> > array(3) { > ["rest\_1"]=\> > string(4) "2013" > ["pre\_1"]=\> > string(2) "04" > ["test\_1"]=\> > string(14) "ABC\_042013.png" > } usw. wobei alle Dateinamen nach dem Muster "ABC\_MMYYYY.png" MM = Monat YYYY = Jahr aufgebaut sind. und von "ABC\_042013.png" bis "ABC\_122010.png" reichen. Nun mochte ich alle Werte aus den Schlüsseln "test\_1" aus den unter Arrays vom Array $in in ein neues Array schreiben lassen. So etwa: Array ( [1] =\> ABC\_042013.png [2] =\> ABC\_032013.png [3] =\> ABC\_022013.png ) usw. Wie setze ich das um ? Bitte beim erklären daran denken Ich bin PHP-Newbie. Für deine Hilfe Danke ich im voraus. Andreas

Hallo Andreas,

Warum machst du es nicht so, wie du auch das mehrdimensionalen Array erstellt hast?

$fielnames=array();
foreach ($in as $filen) {
 array\_push($fielnames,$filen["test\_1"]);
} 

array_push fügt den Wert einfach an das filenames-array an, welches hier leer initialisiert wird. Der Rest wurde von dir ja schon benutzt.

Hallo Andreas,

eigentlich ganz einfach und selbsterklärend!

$your_new_sort_array = array();
reset($your_sort_array);
while(list($key, $val) = each($your_sort_array)){
$your_new_sort_array[] = $val[‚test_1‘];
}

Lg
Richie

Hallo,

Dazu schreibst du in deine foreach schleife einfach:

$fileArray[] = $row[‚test_1‘];

Viele grüße,
Till

Hallo Till,

vielen Dank für deine Hilfe. Folgende Lösung hat das gewollte Ergebnis gelifert:

$your\_new\_sort\_array = array();
reset($your\_sort\_array);
while(list($key, $val) = each($your\_sort\_array)){
 $your\_new\_sort\_array[] = $val['test\_1'];
}

Andreas

Warum machst du es nicht so, wie du auch das mehrdimensionalen
Array erstellt hast?

$fielnames=array();
foreach ($in as $filen) {
array_push($fielnames,$filen[„test_1“]);
}

array_push fügt den Wert einfach an das filenames-array an,
welches hier leer initialisiert wird.

Hallo Julian,

vielen Dank für deine Hilfe. Folgende Lösung hat das gewollte Ergebnis gelifert:

$your\_new\_sort\_array = array();
reset($your\_sort\_array);
while(list($key, $val) = each($your\_sort\_array)){
 $your\_new\_sort\_array[] = $val['test\_1'];
}

Andreas

eigentlich ganz einfach und selbsterklärend!

$your_new_sort_array = array();
reset($your_sort_array);
while(list($key, $val) = each($your_sort_array)){
$your_new_sort_array[] = $val[‚test_1‘];
}

Hallo Richie,

vielen Dank für deine Hilfe. Deine Lösung hat genau das gewollte Ergebnis geliefert.

Andreas

Das geht natürlich auch.ist aber nicht sehr effizient, wenn du dafür eine neue schleife machst.

Mmh… list und each kannte ich noch nicht, der Code scheint mir aber exakt das selbe zu tun wie mein Code.
Auch von der Performance sollte das etwa gleich sein. Dein Code benutzt intern wohl 3 Variablen mehr, aber das sollte im Bereich von µs liegen…

naja, vielen Dank für die Rückmeldung und die Lösung^^

Moin moin!

Sorry zunächst, dass ich so lange gebraucht habe, ich hatte etwas Prüfungs-Stress in den letzten Wochen.

Zu deiner Frage antworte ich dir jetzt ganz kurz und knapp, denn die Antwort ist nicht kompliziert :smile::

Entweder schreibst du in der Schleife, in der das Array $in beschrieben wird parallel dazu auch ein weiteres Array:

foreach ($files2 as $con1) {
$in[] = array(
‚rest_1‘ => substr ( $con1, 6, 4 ),
‚pre_1‘ => substr ( $con1, 4, 2 ),
‚test_1‘ => $con1
);
$test[] = $con1;
}

oder in der Schleife danach, in der du ja bereits aus „rest“ und „pre“ (obwohl ich hier „month“ und „year“ als treffendere Bezeichner empfunden hätte) separate Arrays erstellst.

Inwiefern der Befehl arraymultisort() für deine Frage jetzt relevant ist sei einmal dahingestellt :smile:.

Aber ich habe auch noch einen weiteren Tipp für dich: Du kannst mit der date()-Funktion einfach die Zeichenkette „mY“ nutzen, statt hier ein Leerzeichen zwischen zu fügen und das dann anschließend durch str_replace() zu ersetzen, das ist nicht nur schwerer zu lesen, sondern raubt auch Performance bei stark frequentierten Seiten.

Ich hoffe, dass ich deine Frage beantworten konnte!?

MfG
Lutz

Hallo Lutz,

kein Problem. Wenn man Prüfungen hat ist das natürlich wichtiger.

Entweder schreibst du in der Schleife, in der das Array $in
beschrieben wird parallel dazu auch ein weiteres Array:

foreach ($files2 as $con1) {
$in[] = array(
‚rest_1‘ => substr ( $con1, 6, 4 ),
‚pre_1‘ => substr ( $con1, 4, 2 ),
‚test_1‘ => $con1
);
$test[] = $con1;
}

oder in der Schleife danach, in der du ja bereits aus „rest“
und „pre“ (obwohl ich hier „month“ und „year“ als treffendere
Bezeichner empfunden hätte) separate Arrays erstellst.

Folgende Lösung hat das gewollte Ergebnis geliefert:

$your\_new\_sort\_array = array();
reset($your\_sort\_array);
while(list($key, $val) = each($your\_sort\_array)){
 $your\_new\_sort\_array[] = $val['test\_1'];
}

Aber ich habe auch noch einen weiteren Tipp für dich: Du
kannst mit der date()-Funktion einfach die Zeichenkette „mY“
nutzen, statt hier ein Leerzeichen zwischen zu fügen und das
dann anschließend durch str_replace() zu ersetzen, das ist
nicht nur schwerer zu lesen, sondern raubt auch Performance
bei stark frequentierten Seiten.

Vielen Dank für die Hilfe und deinem Tipp.

Andreas