2017-02-08 2 views
0

Ich habe ein multidimensionales Array, das den Schlüssel name einmal oder mehrmals enthalten kann oder nicht. Was ich tun möchte ist, dass für jede Instanz dieses Elements ein anderes Element neben dem Element mit dem Schlüssel key eingefügt wird.Rekursiv Element neben anderem Element in Array einfügen

Also, dieses Array gegeben:

[ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'label' => 'Baz' 
    ] 
] 

Ich mag die folgende Ausgabe:

[ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'key' => 'foo-key', # This is inserted by the function 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'key' => 'bar-key', # This is inserted by the function 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'key' => 'baz-key', # This is inserted by the function 
     'label' => 'Baz' 
    ] 
] 

Ich habe in array_walk_recursive aussehen, aber es kann nicht an der Arbeit. Muss ich meine eigene rekursive Funktion schreiben oder gibt es etwas Geeignetes, das ich dafür verwenden kann?

+0

Teilen Sie den Code, den Sie mit array_walk_recursive schrieb & was nicht funktioniert hat. – alzee

+0

Tbh Ich wurde sofort ratlos, weil ich scheinbar nicht auf das ursprüngliche Array innerhalb meines 'array_walk_recursive' Callbacks zugreifen konnte ... Ich bin mir ziemlich sicher, dass ich eine benutzerdefinierte Funktion dafür schreiben könnte, aber immer noch auf einige Vorschläge für Builds gehofft habe in Funktionen oder anderen Ideen, die ich vielleicht übersehen habe. – powerbuoy

+1

array_walk_recursive gibt Ihnen die Elemente, die kein Array sind. Wenn es auf ein Array-Element stößt, wird es weiter gegraben. Wahrscheinlich hat es deshalb nicht für dich funktioniert. Wie auch immer, wenn Sie das Feld 'use' verwenden, um Ihr Array in den Closing-Bereich zu senden, können Sie darauf zugreifen (wird Ihnen in diesem Fall aber immer noch nicht helfen). –

Antwort

2

Ihr Code würde wie folgt sein:

<?php 
$array = [ 
    [ 
     'noname' => 'No name', 
     'label' => 'I have no name' 
    ], 
    [ 
     'name' => 'foo', 
     'label' => 'Foo', 
     'fields' => [ 
      [ 
       'name' => 'bar', 
       'label' => 'Bar' 
      ] 
     ] 
    ], 
    [ 
     'name' => 'baz', 
     'label' => 'Baz' 
    ] 
]; 

function fix_array($array){ 
    foreach ($array as $key => $value){ 
     if (is_array($value)){ 
      $array[$key] = fix_array($value); 
     } 
     elseif ($key == 'name'){ 
      $array['key'] = $value . '-key'; 
     } 
    } 
    return $array; 
} 

$new_array = fix_array($array); 

print_r($new_array); 
+0

Danke dafür, ich denke es wird nicht viel einfacher als das :) – powerbuoy

+0

Gern geschehen! Ich bin froh, dass es geholfen hat. – jetblack