2017-07-27 6 views
0

Zum Beispiel habe ich Objekte:Wie verschachtelte Arrays aus verschachtelten Objekten erstellen?

<?php 

class A 
{ 
    public $key; 
    public $parent; 
} 

class B 
{ 
    public $value; 
    public $objects; 
} 

$a1 = new A(); 
$a1->key = 'a1'; 
$a2 = new A(); 
$a2->key = 'a2'; 
$a2->parent = $a1; 
$a3 = new A(); 
$a3->key = 'a3'; 
$a3->parent = $a2; 

$b = new B(); 
$b->objects = [$a1, $a2, $a3]; 
$b->value = 100; 
someFunction($b); 

In Folge ich Array erhalten müssen diese wie:

[ 
'a1' => ['a2' => ['a3' => 100]] 
] 

Wie kann ich dieses Array bauen? Natürlich sind 3 Objekte nur ein Beispiel, dieser Wert kann größer oder kleiner sein, also brauche ich eine rekursive Funktion, denke ich.

+0

Sie mögen Ihr Objekt bauen und es dann mit (Array) $ Objekt zu konvertieren? – mkaatman

+0

Der gewünschte Effekt ist nicht ausreichend definiert. Kommen Sie aufgrund der Elternbeziehungen oder wegen der Wertvariablen zu Ihrem Ergebnis? Weil einer von diesen redundant ist. Auch sollten Sie zumindest versuchen, einen Prototyp Ihrer Funktion zu entwickeln und hier zu veröffentlichen. – Kempeth

Antwort

1

Eine andere Lösung, aber ohne die globale Variable:

function nested($ob, $val, $res){ 
    if($res == array()) { 
    $res = $val; 
    } 
    $res = array($ob->key => $res); 
    if(is_object($ob->parent)){ 
    $res = nested($ob->parent, $val, $res); 
    } 
    return($res); 
} 

$res = nested($b->objects[count($b->objects) - 1], $b->value, array()); 

echo("<pre>"); 
print_r($b); 
print_r($res); 
0

Die Umwandlung von Ihrer Objektstruktur

{ 
    'objects':[ 
    { 
     'key':'a1' 
    }, 
    { 
     'key':'a2', 
     'parent':{ 
     'key':'a1' 
     }, 
    }, 
    { 
     'key':'a3', 
     'parent':{ 
     'key':'a2', 
     'parent':{ 
      'key':'a1' 
     } 
     } 
    } 
    ], 
    'value':100 
} 

zu:

[ 
'a1' => ['a2' => ['a3' => 100]] 
] 

ist nicht trivial. Sie müssen dafür eine Art von Funktion erstellen.

+0

ja, und ich bitte um Hilfe für die Erstellung dieser Funktion =) – engilexial

+0

Ich denke, dass ich dies tun würde: im letzten Element rekursiv ersetzen, zum Beispiel "Eltern" mit der Wert 'Schlüssel'. Aber kann es andere Möglichkeiten geben? – engilexial

0

Dies war eine sehr interessante Aufgabe zu lösen! Danke fürs Schreiben. Es ist immer noch nicht der perfekte Code, weil es eine globale Variable in der Funktion gibt, aber es funktioniert. Ich hoffe es ist einfach. Ich habe es sogar mit vier Objekten getestet.

$res = array(); 

function nested($ob, $val){ 
    global $res; 

    if($res == array()) { 
    $res = $val; // Set the deepest value in the array to $val 
    } 
    // Form: put a new array around the old 
    $res = array($ob->key => $res); 
    if(is_object($ob->parent)){ 
    nested($ob->parent, $val); // parent -> go deeper 
    } 
} 

nested($b->objects[count($b->objects) - 1], $b->value); 

echo("<pre>"); 
print_r($b); 
print_r($res); 

Ich hoffe, dass geholfen :)

Verwandte Themen