xaero1982
Goto Top

Dynamisches Array erstellen in PHP

Moin Zusammen,

ich bräuchte mal einen Geistesblitz.

Ich habe ganz viele Daten in einer MongoDb.
Ich möchte diese Daten nun exportieren in eine CSV Datei. Dabei soll die Sortierung aber flexibel bleiben.

Enthalten sind z.B. Name, Vorname, Geb.Datum, Geb.Ort etc.

Nun soll derjenige, der ein Export benötigt flexibel gestalten können an welcher stelle in der CSV der Wert drin steht.

Als Frontend dachte ich mir einfach die möglichen Felder aufzulisten, daneben ein DropDown mit den Nummern eins bis x. Über Ajax dann alle Nummern ausblenden, die in einem anderen DropDown gewählt worden sind.

So weit so gut. Aber ich hab im Moment noch keine Idee wie ich ein Array erstellen kann bei dem ich z.b.

$export = array(name, vorname,Geb.Datum,Geb.Ort) habe bzw. dann ein Array:
$export = array(Geb.Datum,Geb.Ort,Vorname,Name) habe.

Je nachdem welche Reihenfolge der Nutzer haben will.

Hat jemand eine Idee? face-smile

Grüße

Content-Key: 549164

Url: https://administrator.de/contentid/549164

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 08:27:52 Uhr
Goto Top
Wie greifst du denn auf die DB zu?

Ich hab mich zwar schon etwas länger nicht mehr mit PHP befasst, aber grundsätzlich bietet PHP mit PDO doch nicht Möglichkeit mit benannten Parametern die Abfrage abzufeuern und dann kann ich das Ergebnis immer noch "dynamisch" anordnen in der Form, dass ich sage, in welcher Reihenfolge die Attribute ausgegeben werden.
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 08:36:17 Uhr
Goto Top
Na über die php mongo libary?!

Das ist aber aktuell gar nicht die Frage. Die Frage ist ja wie bekomme ich ein flexibles Array hin und da ist die DB ja grds. erstmal wurscht.
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 08:39:33 Uhr
Goto Top
Dann tut mir das Missverständnis leid. Sorry.
Mitglied: erikro
erikro 19.02.2020 um 08:47:05 Uhr
Goto Top
Moin,

Hat jemand eine Idee? face-smile

Wie heißt es nicht so schön in dem Lied "Summertime": So hash little baby, don't you cry. face-wink Ich würde die Daten nicht in einem Array sammeln, sondern einem Hash. Dann musst Du nicht wissen, an welcher Stelle im Array z. B. das Geb.Datum steht, sondern kannst es direkt über seinen Namen ansprechen. Dann noch ein Array in dem Du die Reihenfolge der Feldnamen hast, die der User gerne hätte. Darüber ein Foreach laufen lassen und entsprechend die Daten aus dem Hash holen. So als Ansatz. PHP ist zu lange her, als dass ich das auf die Schnelle programmieren könnte.

hth

Erik
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 08:58:55 Uhr
Goto Top
Zitat von @TRDSRLZ:

Dann tut mir das Missverständnis leid. Sorry.
Ach alles gut face-smile
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 09:04:12 Uhr
Goto Top
Aber vielleicht hilfst du mir beim verstehen. Oder wir reden beide aneinander vorbei.

Ich habe verstanden: du erzeugst eine DB-Abfrage die eine CSV zurückliefert. Die CSV enthält verschiedene Attribute und du willst die Attribute dynamisch neu anordnen in PHP?

Da stell ich mir die Frage, warum nicht schon sie Abfrage so formulieren, dass die Reihenfolge der Attribute passt? Und das würde mit prepared Statements mit PDO funktionieren.

So war es gemeint.
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 09:08:54 Uhr
Goto Top
Zitat von @erikro:

Moin,

Hat jemand eine Idee? face-smile

Wie heißt es nicht so schön in dem Lied "Summertime": So hash little baby, don't you cry. face-wink Ich würde die Daten nicht in einem Array sammeln, sondern einem Hash. Dann musst Du nicht wissen, an welcher Stelle im Array z. B. das Geb.Datum steht, sondern kannst es direkt über seinen Namen ansprechen. Dann noch ein Array in dem Du die Reihenfolge der Feldnamen hast, die der User gerne hätte. Darüber ein Foreach laufen lassen und entsprechend die Daten aus dem Hash holen. So als Ansatz. PHP ist zu lange her, als dass ich das auf die Schnelle programmieren könnte.

hth

Erik

Klingt gut, aber ich hab das auch noch nie gemacht face-smile ich werd mal googlen.
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 09:11:37 Uhr
Goto Top
Zitat von @TRDSRLZ:

Aber vielleicht hilfst du mir beim verstehen. Oder wir reden beide aneinander vorbei.

Ich habe verstanden: du erzeugst eine DB-Abfrage die eine CSV zurückliefert. Die CSV enthält verschiedene Attribute und du willst die Attribute dynamisch neu anordnen in PHP?

Da stell ich mir die Frage, warum nicht schon sie Abfrage so formulieren, dass die Reihenfolge der Attribute passt? Und das würde mit prepared Statements mit PDO funktionieren.

So war es gemeint.

Vergiss mal die DB - das war rein informativ face-smile

Stelle dir 4 Inputfelder vor auf einer HTML Seite.
Name
Vorname
Geb.Ort
Geb.Datum

Daneben gibt es ein DropDown mit einer Nummerierung für eine Sortierung.

User 1 will die CSV in:
Vorname,Name,Geb.Ort,Geb.Datum haben

User 2 will sogar nur:
Name,Vorname haben

User 3 will die CSV als:
Geb.Datum,Name,Vorname haben.

Jeder will also eine andere CSV haben, also muss ich das irgendwie dynamisch erstellen lassen.
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 09:14:45 Uhr
Goto Top
Ja und das ginge mit PDO.

Du kannst nämlich die Abfrage aus der DB dann dynmisch erzeugen und bekommst immer das Ergebnis mit den Feldern zurück die du in der Abfrage formuliert hast. Sogar als assoziatives Array.

Hier mal ein Tutorial dazu:
https://websitebeaver.com/php-pdo-prepared-statements-to-prevent-sql-inj ...

Vorteil du erhöhst auch die Sicherheit deines Codes.
Mitglied: erikro
erikro 19.02.2020 um 09:21:39 Uhr
Goto Top
Moin,

Zitat von @TRDSRLZ:
Du kannst nämlich die Abfrage aus der DB dann dynmisch erzeugen und bekommst immer das Ergebnis mit den Feldern zurück die du in der Abfrage formuliert hast. Sogar als assoziatives Array.

So nennt man das Hash in PHP. Richtig. face-wink Das klingt gut.

Liebe Grüße

Erik
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 09:23:34 Uhr
Goto Top
Siehste, das wusste ich nicht... dann sorry fürs klug###en
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 09:54:25 Uhr
Goto Top
Schade nur, dass es PDO nicht für MongoDB gibt. Ich benutze kein MySQL face-smile
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 09:56:51 Uhr
Goto Top
PDO funktioniert ja nicht nur mit MySQL aber du hast Recht, MongoDB wird nicht unterstützt. Dann doppelt sorry.
Mitglied: falscher-sperrstatus
falscher-sperrstatus 19.02.2020 um 10:57:38 Uhr
Goto Top
Moin,

warum nicht einfach ein Formular, auf dessen Basis die Order und der Umfang der "Query" zusammengesetzt wird? Das kannst du dann ja dynamisch per drag und drop ausdesignen, Reihenfolge und ob überhaupt aktiv. Ob das den Aufwand wert ist musst du selbst wissen.

Viele Grüße,

Christian
certifiedit.net
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 14:44:42 Uhr
Goto Top
Das ist ja lediglich ein "Designvorschlag" von dir, aber das was im Hintergrund passiert ist damit noch immer unklar.

Das mit dem Query war aber ein Stichwort, aber leider kann man damit keine Reihenfolge vorgeben.

Selbst wenn ich die Werte aus der DB, die dort mit Name, Vorname, Geb.Datum und GebOrt drin stehen im Query anders sortiere, bekomme ich die Daten so ausgeworfen wie sie die Reihenfolge in der DB hergibt.
Aber ich denke das ist schon mal ein guter Anfang.
Mitglied: falscher-sperrstatus
falscher-sperrstatus 19.02.2020 um 14:47:07 Uhr
Goto Top
Wie hättest du das aufgebaut? Lautsprecher und die Wünsche in die offene Welt geschrieen?

Ohne Query geht es nicht, und die kannst du dynamisch aufbauen...

und nein, die Query gibt die Sortierung vor...also ich seh mich ja echt nicht als Ass in PHP, aber das ist doch basis der basis?
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 15:07:36 Uhr
Goto Top
Das Frontend ist - nochmal - gerade total irrelevant.

Reden wir vom gleichen Query? Es geht um ein Query an eine MongoDb und der gibt eben keine Sortierung vor.
Mitglied: TRDSRLZ
TRDSRLZ 19.02.2020 um 15:10:36 Uhr
Goto Top
Ok. Aber du setzt eine Query ab. Bekommst ein Ergebnis zurück und erzeugst daraus deine CSV?

Wenn das so ist, warum gehst du nicht einen Zwischenschritt? Erzeugst ein Assoc_Array mit dem Ergebnis deiner Query und erzeugst die CSV dann anhand der Benutzerpräferenz über das Assoc_Array?
Mitglied: falscher-sperrstatus
falscher-sperrstatus 19.02.2020 um 15:12:51 Uhr
Goto Top
Ich rede vom Backend...und da noch kein query vorgestellt hast, können wir nicht vom gleichen reden, insbesondere, da es ja dynamisch sein soll. Wobei sich für mich die Basis nicht erschliesst, warum für den einen User

Name, nachname, strasse, plz, ort ein problem darstellt und er name und nachname getauscht braucht. Eine verkürzung auf strasse, plz, ort oder nachname, name macht natürlich sinn..aber ich hoffe, dass dies auch kein Problem ist.
Mitglied: Xaero1982
Xaero1982 19.02.2020 um 15:29:49 Uhr
Goto Top
Auszug
$filter = 
$options = [ 'projection' => ['_id' => 0,'s_nachname' =>1, 'gebort'=>1, 's_vorname'=>1, 'gebdatum'=>1, 's_nummer'=>1]];  
$col = (new MongoDB\Client)->db->collection;
$result = $col->find($filter, $options);



foreach($result as $value) {
		echo '<pre>';  
		print_r($value);
		echo '</pre>';  
}
Gibt was zurück?

MongoDB\Model\BSONDocument Object
(
    [storage:ArrayObject:private] => Array
        (
            [s_nummer] => 1
            [s_nachname] => Mustermann
            [s_vorname] => Max
            [gebdatum] => 2000-01-01
            [gebort] => New York
        )

)

Alternativ:

	$filter = ;
	$options = [ 'projection' => ['_id' => 0,'s_nachname' =>1, 'gebort'=>1, 's_vorname'=>1, 'gebdatum'=>1, 's_nummer'=>1]];  
	$mongo = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
	$query = new MongoDB\Driver\Query($filter, $options);
	$rows = $mongo->executeQuery('db.collection', $query);  
	
	foreach($rows as $r){
		
		echo '<pre>';  
		print_r($r);
		echo '</pre>';  
	}

Gibt was zurück?

stdClass Object
(
    [s_nummer] => 1
    [s_nachname] => Mustermann
    [s_vorname] => Max
    [gebdatum] => 2000-01-01
    [gebort] => New York
)

Die Reihenfolge der Ausgabe entspricht dem wie es in der mongoCollection angelegt wurde.
Mitglied: erikro
erikro 20.02.2020 um 16:43:24 Uhr
Goto Top
Moin,

Zitat von @Xaero1982:
> MongoDB\Model\BSONDocument Object
> (
>     [storage:ArrayObject:private] => Array
>         (
>             [s_nummer] => 1
>             [s_nachname] => Mustermann
>             [s_vorname] => Max
>             [gebdatum] => 2000-01-01
>             [gebort] => New York
>         )
> 
> )
> 

Da hast Du Dein Hash oder assioziatives Array oder Objekt (wie auch immer) ja schon. Jetzt brauchst Du doch nur noch die Daten in der richtigen Reihenfolge auszugeben.

Liebe Grüße

Erik
Mitglied: Xaero1982
Xaero1982 20.02.2020 um 22:57:48 Uhr
Goto Top
Habe es inzwischen auch hinbekommen.