Konvertieren von json-array mit rekursive Methode?
Ich versuche zum konvertieren von json-Zeichenfolge in ein array in ein array,
$config = array(
"type" => '{"category":"admin","page":"page"}',
"say" => "Hello",
"php" => array(
"say" => "no",
"type" => '{"category":"admin","page":"page"}',
"gran" =>array(
"name" => "Hi"
)
)
);
Meinen funktionierenden code,
class objectify
{
public function json_to_array($array, $recursive = true)
{
# if $array is not an array, let's make it array with one value of former $array.
if (!is_array($array)) $array = array($array);
foreach($array as $key => $value)
{
if($recursive === false) $array[$key] = (!empty($value) && is_string($value) && json_decode($value) != NULL) ? json_decode($value, true): $value;
else $array[$key] = (!empty($value) && is_string($value) && json_decode($value) != NULL) ? json_decode($value, true): is_array($value) ? self::json_to_array($array) : $value;
}
return $array;
}
}
Funktioniert es einwandfrei ohne rekursive Methode aber Pausen, wenn ich will die rekursive wie Sie sehen können in meinen code oben,
$object = new objectify();
$config = $object->json_to_array($config);
print_r($config);
Fehlermeldung,
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2048 bytes) in C:\wamp\www\test\2012\php\set_variable.php on line 79
Ich will einfach nur, um dieses Ergebnis,
Array
(
[type] => Array
(
[category] => admin
[page] => page
)
[say] => Hello
(
[say] => no
[type] => {"category":"admin","page":"page"}
[gran] => Array
(
[name] => Hi
)
)
)
EDIT:
$config = 'type={"category":"admin","page":"page"}&text_editor={"name":"mce-basic"}&parent_id=self&subtitle=true&description=true&content_1=true&script_1=true&primary_image=true';
parse_str($config,$array);
print_r($array);
Ergebnis,
Array
(
[type] => {"category":"admin","page":"page"}
[text_editor] => {"name":"mce-basic"}
[parent_id] => self
[subtitle] => true
[description] => true
[content_1] => true
[script_1] => true
[primary_image] => true
)
Könnte ich Fragen, warum genau du hast teilweise (und nur teilweise) analysiert JSON in Ihren Daten Struktur?
Wie hast du Sie bekommen ein array von JSON-strings in den ersten Platz? Scheint, wie diejenigen, die kommen sollen als JSON-array, das könnte man nur Dekodieren alle auf einmal.
Brauchen Sie Hilfe für die Adressierung der Speicher-Problem?
bitte siehe mein edit oben.
OK... weiß immer noch nicht, warum man die übergabe im query-Parameter JSON-Werte, anstatt nur darum, ein JSON-Dokument in den request-body.
Wie hast du Sie bekommen ein array von JSON-strings in den ersten Platz? Scheint, wie diejenigen, die kommen sollen als JSON-array, das könnte man nur Dekodieren alle auf einmal.
Brauchen Sie Hilfe für die Adressierung der Speicher-Problem?
bitte siehe mein edit oben.
OK... weiß immer noch nicht, warum man die übergabe im query-Parameter JSON-Werte, anstatt nur darum, ein JSON-Dokument in den request-body.
InformationsquelleAutor laukok | 2012-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schnelle Lösung:
Wenn nicht alle Ihre Parameter sind JSON, und Sie wollen die tatsächlichen arrays statt
stdClass
Objekte, die Sie haben können, um dies zu tun:Wenn du mehr Ebenen von verschachtelten arrays außerhalb der JSON -, dann müssen Sie Ihre eigenen Rekursion. Versuchen Sie diese version von der Objektivierung:
Welche funktioniert gut für mich auf beide Sätze von sample-Daten.
Hm. Mein Ergebnis war, fehlt den nicht-JSON-Werte - Feste im edit oben, aber sonst gut aussieht. Was ist anders?
Sieht gut aus, wusste nicht, json_decode wurde rekursiv 🙂 Def. die bessere Lösung op.
danke es funktioniert gut, aber bricht immer noch mit dem array wie in meinem OP. Ich bekomme diese Fehlermeldung
Warning: json_decode() expects parameter 1 to be string, array given in C:\wamp\www\test\...
das array habe ich vielleicht mehrdimensionales array...
InformationsquelleAutor Mark Reed
Soweit Ihr code betroffen ist, es scheint, Sie haben einen Fehler gemacht, wodurch es zu loop forever (letzter Teil des rekursiven Abschnitt):
Sie füttern das ganze array in der rekursiven Funktion statt der Wert, getestet zu werden, ein array.
Ändern, um:
Sollte das lösen.
Edit: Es scheint, dass die verschachtelten ternären Zustand, das problem verursacht, wenn Sie Klammern um das zweite, es funktioniert:
Siehe das Beispiel.
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in C:\wamp\www\test\2012\php\set_variable.php on line 79
Nutzung von PHP ' s built-in Funktionen anstatt Ihre eigenen Rekursion sind Sie weit mehr performant.
Ich kann nicht finden, die Quelle, aber ich habe irgendwo gelesen, dass verschachtelte ternäre Operatoren kann zu unerwarteten Ergebnissen führen. Ändert es etwas, wenn du in Klammern, dass der Letzte Abschnitt (die, die ich gepostet)?
Ich glaube nicht, es war hilfreich, ermutigend, das einen schlechten/fehlgeleiteten Ansatz für die Lösung.
Es scheint, die verschachtelte ternäre war das problem, siehe mein edit.
InformationsquelleAutor jeroen
Alles viel leichter.
vielen Dank es funktioniert perfekt. aber wie kann ich mich bewerben
array_walk_recursive($config, 'objectify');
in einer Klasse wie der in meinem OP?InformationsquelleAutor PorridgeBear
Vielleicht können Sie mit der easy-Funktion:
Finden Sie hier: https://gist.github.com/victorbstan/744478
InformationsquelleAutor Eric Lagarda