• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Auslesen von mehrdimensionalem Array (Fehler?)

RP-User

New member
Hallo,
ich versuche im Moment recht verzweifelt ein gebasteltes mehrdimensionales Array auszulesen und bin mit meinem doch recht flachen PHP Wissen am Ende.

Kontext:
Die Daten kommen von den POST-Daten und wurden über JavaScript erzeugt, so dass nicht bekannt ist wieviele vorhanden sind und wie diese genau heißen.
Es geht um Vor- und Nachnamen von Autoren. Es können beliebig viele Autoren angegeben werden. Ein einem Hash soll je Vor- und Nachname sein, damit diese über ein Key (den Namen der Textbox, wo die Daten eingegeben wurden) ausgelesen werden kann.
Das ganze soll nachher in der Datenbank gespeichert werden.

Im Moment sieht das so aus:
PHP:
try
{
	// initialize data

    //// author data
$authornames = "";
for ($i=0; $i<5; $i++)
{
    $authornames .= array ("authornames".$i => array("tbInputAuthorLastName".$i=>$_POST['tbInputAuthorLastName'.$i], "tbInputAuthorFirstName".$i=>$_POST['tbInputAuthorFirstName'.$i]));
}
echo "<br/>hier:";
print_r ($authornames);
echo "<br/>";

echo "versuch2:";
var_dump($authornames['authornames0']['tbInputAuthorLastName0']);
echo "<br/>";
echo "versuch3";
print_r($authornames['authornames0']['tbInputAuthorLastName0']);
echo "<br/>";
}
...

Ich habe gegooglet, ich habe gebingt und nur print_r und var_dump gefunden was mich leider nicht mal dem ziel näher gebracht hat. Was erstmal wäre - wie ist das ganze nun wirklich aufgebaut, damit ich nachher versuchen kann das auszulesen.
Zum auslesen fällt mir noch gar nichts ein, weil ich langsam durch dieses toll assoziative array nicht mehr durchblicke - hab ich nur einen Fehler beim Aufbau gemacht (Außer das meine For-Schleife nur eine unzureichende Bedingung hat)?

Ausgabe:
hier:ArrayArrayArrayArrayArray
versuch2:
Fatal error: Cannot use string offset as an array in C:\Programme\xampp\htdocs\rp\includes\inclAddNewWork.php on line 31

Hilfe :(
 
Zeig doch mal die Struktur deines Formulars.
So wie ich das errate, hast du ein Formular mit beliebig vielen paaren von authorFirstName- und authorLastName-Feldern. Wenn du statt einer angehängten Nummer eckige Klammern nutzt, bekommst du dein Array schon von PHP direkt geliefert.

PHP:
<form action="test.php" method="post">
    <input type="text" name="firstName[]"/>
    <input type="text" name="firstName[]"/>
    <input type="text" name="firstName[]"/>
    <input type="submit" value="los gehts"/>
</form>

<?php
if(isset($_POST)){
    echo $_POST['firstName'][0].'<br>';
    echo $_POST['firstName'][1].'<br>';
    echo $_POST['firstName'][2].'<br>';


	foreach($_POST['firstName'] as $index => $firstName){
		echo $firstName ." an Position ".$index."<br>";
	}
}
?>

Ansonsten verstehe ich nicht warum du die Daten aus dem assoziativen $_POST-Array noch mal in ein anderes Array speichern willst.


Deine for-Schleife macht nicht so viel Sinn. Durch das .= hängst du dein gerade erzeugtes Array an einen String. Das Array wird dadurch in einen String umgewandelt, und das sieht in PHP so aus, dass einfach "Array" zurückgegeben wird.

Ich vermute mal dass du dann für jedes firstName und lastName Paar einen Eintrag in einer Tabelle author tätigen willst. Würde ich so lösen (mit obiger Formularstruktur):

PHP:
<?php
// vorher checken, dass mindestens ein FirstName/LastName Paar existiert und das von beiden gleich viele existieren

$query = 'INSERT INTO `author` (`firstName`, `lastName`) VALUES';
for($i = 0; $i < count($_POST['firstName']); $i++) {
	$query .= ' ('.$_POST['firstName'][$i].', '.$_POST['lastName'][$i].'),';
}
$query = substr($query, 0, -1); // letzte Komma muss wieder weg
echo $query;
?>
 
Hallo,
erstmal danke für die gute Antwort mit Beispiel.

Die Lösung für die Query wird mir später sehr helfen - Danke!

Das mit den Hashes hab ich mir auch angeschaut und getestet, mit der Struktur hast du absolut recht. Mein Problem ist nur, dass ich mit deiner Methode und auch meinem ersten (weitaus unsinnig komplizierterem) Versuch die Vor- und Nachnamen in getrennten Hashes hätte und so evtl. die Zusammengehörigkeit verliere oder diese dann wieder über Nummern rausfinden müsste. Das ist der Grund dafür warum nicht direkt aus POST sondern am liebsten in einem Hash der vor und nachnamen enthält ...

Die Feldernamen lauten:
"tbInputAuthorLastName1" für den 1. Nachnamen
"tbInputAuthorLastName2" für den 2. Nachnamen
...
"tbInputAuthorFirstName1" für den 1. Vornamen
"tbInputAuthorFirstName2" für den 2. Vornamen
...

daher habe ich in der for-schleife auch das $i zu dem Key hinzugefügt, weil ich davon ausgehe, dass er mir dann so meinen Key korrekt benennt (nämlich schon so, wie die Textbox heißt).
das selbe $i habe ich für den hash genommen der den vor und nachnamen des jeweiligen autors beinhaltet, wieder damit ich weiß - in authornames1 steckt der vor und nachname des 1. Autors und diesen kann ich dann über den Namen der Textbox + die gleiche Zahl auslesen.

Das mit der Konkadination hab ich nicht gewusst, hab leider nichts gefunden wie ich zu einem bestehenden Array ein weiteres Element hinzufügen kann, weiß nur noch das es in php geht, weil die Gesamtgröße nicht definiert werden muss.

Nochmal die For-Schleife zur Verdeutlichung
PHP:
for ($i=0; $i<5; $i++)
{
    $authornames .= array ("authornames".$i => array("tbInputAuthorLastName".$i=>$_POST['tbInputAuthorLastName'.$i], "tbInputAuthorFirstName".$i=>$_POST['tbInputAuthorFirstName'.$i]));
}

das sind meine Gedankengänge dazu, möglich das ich das viel zu kompliziert mache und die einfache Lösung nicht kenne oder nicht sehe - oder es einfach falsch ist.

Würde mich über Hilfe / passende Alternativen sehr freuen.
 
Array erweitern: array_push

oder $authornames[] = array(...);

Wie soll denn die Zusammengehörigkeit verloren gehen? Mußt halt darauf achten das du beide Arrays synchron durcharbeitest. Wenn du die Klammerschreibweise verwendest werden auch die leeren Felder mitgeschickt. Wenn die Felder in der richtigen Reihenfolge erzeugt werden, sollte dass so keine Probleme ergeben.
 
Zurück
Oben