• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Array von HTML nach PHP via Ajax / JSON?

Spoiler

Mitglied
Hallo Zusammen,

nachdem ich jetzt schon einige Zeit erfolglos gegoogelt und experimentiert habe, hoffe ich, dass ihr mir helfen könnt.

Folgendes Szenario will ich umsetzen:
- Aus einer Datenbank werden in einem Formular Daten in Textfeldern angezeigt, die man bearbeiten kann.
- Die Anzahl der Datensätze ist variable

Das bekomme ich auch ohne Probleme hin.

Im HTML sieht das Ganze dann etwa so aus:
HTML:
<input type="text" name="Datensatz[]" value="XYZ" />

Wenn ich das Formular abschicke, erzeugt PHP ein Array mit dem Namen Datensatz.
Supi.

Mein Problem ist jetzt, wie ich dieses Array erzeuge, wenn ich die Daten mittels JSON per Ajax übermittle?

Dazu habe ich schonmal jedem Datensatz seine ID mitgegeben:
HTML:
<input type="text" name="Datensatz[1]" value="ABC" />
<input type="text" name="Datensatz[2]" value="XYZ" />

Der JSON-String sieht dann so aus:
Code:
{"Datensatz[1]":"ABC","Datensatz[2]":"XYZ"}

Der kommt so auch am Server an. Ein json_decode macht dann daraus folgendes Array:
Code:
ARRAY(
Datensatz[1] => "ABC",
Datensatz[2] => "XYZ"
)

Das stellt ein kleines Problem dar. Denn ich bräuchte das Ganze eher so:
Code:
ARRAY(
Datensatz => Array( [1] =>"ABC", [2] => "XYZ")
)

Im ersten Fall kann ich Datensatz als Array nicht mit Foreach durchgehen, im zweiten Fall schon.

Meine Frage ist nun also, wie ich die Daten übermitteln kann um dann auf der Serverseite wieder ein "richtiges" Array zu bekommen??

Vielen Dank im Voraus.

Gruß

Spoiler
 
Werbung:
Willkommen im Forum.

Du könntest die Feldnamen in einem einfach parsebaren Format erzeugen („datensatz_1“ oder so) und im PHP-Teil zerlegen.

Sicherlich geht es auch irgendwie anders, aber mir scheint das nicht „kompliziert“ genug, um mehr Zeit als nötig dafür aufzuwenden, falls du keinen besonderen Grund dafür hast.

Dass PHP normalerweise automatisch die Arrays baut, ist in gewisser Weise sowieso „magic“.
 
Mein Problem ist, dass ich mehrere Felder habe, die alle von einander abhängig sind.
In diesem Beispiel: Name, Template, Style

Wenn ich jetzt den Datensatz Nummer 40 habe, müssen Name[40], Template[40] und Style[40] eben zusammenbleiben.

Wie mache ich denn aus "datensatz_1 = A", "datensatz_2 = B" und "datensatz_5 = C" ein Array datensatz =>([1]=A, [2]=B, [3]=C) ?
Und wie mache ich das, wenn ich nicht weiß, wieviele datensatz_x ich habe?

Und was wäre kompliziert genug bzw. was wäre ein besonderer Grund?

Danke.
 
Werbung:
Moin,
ein eifacher Regex könnte da helfen.
PHP:
$jsonString= '{"Datensatz[1]":"ABC","Datensatz[2]":"XYZ"}';

$jsonArray = json_decode($jsonString);

$array = array();
foreach($jsonArray AS $name => $value) {
  // erste Zahl in $name finden
  preg_match("/\d+/", $name, $zahl);
  $array[$zahl[0]] = $value;
  }

print_r($array);
Reicht dir das so?

MfG
 
Leider nicht ganz:

Hier mal das Array, wie es nach dem decode aussieht:

PHP:
Array
(
[Do] => "adm/style/save"
[Name[20]] => "cell"
[Template[20]] => 0
[Submit[20]] => "Löschen"
[Name[19]] => "space"
[Template[19]] => 1
[Submit[19]] => "Löschen"
[Submit] => "save"
)

Wenn das mit dem Regex durchlaufen lasse, kommt folgendes raus:
PHP:
Array
(
[] => "save"
[20] => "Löschen"
[19] => "Löschen"
)

Könnte man dann die Zahl nicht auch mit INTVAL extrahieren?

Danke
 
Nachtrag:

im Prinzip müsste ich ja nur aus
PHP:
JSONARRAY['Name[20]']

folgendes machen:
PHP:
JSONARRAY['Name'][20]

Das wäre es, glaube ich.
 
Werbung:
PHP:
Array
(
[Do] => "adm/style/save"
[Name[20]] => "cell"
[Template[20]] => 0
[Submit[20]] => "Löschen"
[Name[19]] => "space"
[Template[19]] => 1
[Submit[19]] => "Löschen"
[Submit] => "save"
)
Daraus muss ja sowieso ein mehrdimensionales Array werden, was man auch nicht einfach mit foreach durchgehen kann.
Welche Variablen sollen denn am Ende dabei rauskommen?
Sowas wie $Submit[20] = "Löschen"?

Das wird wohl nicht funktionieren...
 
PHP:
foreach ($JSONARRAY as $name => $value)
{
eval ('$' . $name . ' = "' . $value . '";"');
}

hat ein Ergebnis gebracht, dass schon etwa so aussieht, wie das, was ich brauchen kann.
Auch wenn mir hier das "eval" nicht wirklich gefällt.
 
PHP:
Array
(
[Do] => "adm/style/save"
[Name[20]] => "cell"
[Template[20]] => 0
[Submit[20]] => "Löschen"
[Name[19]] => "space"
[Template[19]] => 1
[Submit[19]] => "Löschen"
[Submit] => "save"
)

Was soll denn da für Submit sinnigerweise nach der Array-Umwandlung rauskommen? Das passt nicht.
 
Werbung:
ja, ich weis, da ist noch ein Dreher drin ... das kam noch aus dem Experimentieren heraus.

Sinniger weise heißen die Submits, wo "Löschen" dran steht dann "Delete[20]" z.B.
 
Eine Möglichkeit wäre:

PHP:
<?php

function f($a)
{
    $newArray = array();

    foreach ($a as $key => $value) {
        $matches = array();

        if (1 === preg_match('/^([a-z]\w*)\[(\d+)\]$/i', $key, $matches)) {
            if (!array_key_exists($matches[1], $newArray)) {
                $newArray[$matches[1]] = array();
            }

            $newArray[$matches[1]][$matches[2]] = $value;
        } else {
            $newArray[$key] = $value;
        }
    }

    return $newArray;
}

$data = array(
    'Do' => "adm/style/save",
    'Name[20]' => "cell",
    'Template[20]' => 0,
    'Delete[20]' => "Löschen",
    'Name[19]' => "space",
    'Template[19]' => 1,
    'Delete[19]' => "Löschen",
    'Submit' => "save"
);

var_dump(f($data));
 
Werbung:
Zurück
Oben