2017-02-10 3 views
0

Wie kann ich ein flaches Array in ein verschachteltes Array konvertieren, in dem den verschachtelten Schlüsseln derselbe Wert vorangestellt ist. Zum Beispiel sagen, ich habe folgendes Array:Rekursives Reformat Vorgegebenes Array

[ 
    'name' => 'a', 
    'content' => 'b', 
    'author_fullName' => 'c', 
    'author_email' => 'd', 
    'author_role_name' => 'e' 
] 

Dann wird die aus dem Array wäre:

[ 
    'name' => 'a', 
    'content' => 'b', 
    'author' => [ 
     'fullName' => 'c', 
     'email' => 'd', 
     'role' => [ 
      'name' => 'e' 
     ] 
    ] 
] 

Im Idealfall würde ich eine Lösung wie die integrierten Array-Funktionen verwenden, wie ich funktionelle Syntax bevorzugen anstatt For-Schleifen zu verwenden. Ich würde die Hilfe zu schätzen wissen. Dank

+1

http://stackoverflow.com/questions/8243944/functions-to-get-set-values-in-multidimensional- Arrays-dynamisch –

+1

http://stackoverflow.com/questions/27929875/how-to-write-getter-setter-to-access-multi-level-array-by-key-names –

Antwort

1

Try unten Code:

<?php 

$a = [ 
'name' => 'a', 
'content' => 'b', 
'author_fullName' => 'c', 
'author_email' => 'd', 
'author_role_name' => 'e' 
]; 

$finalArray =[]; 
array_walk($a, function(&$value, $key) use(&$finalArray) { 
$indexes = explode('_',$key); 
foreach ($indexes as $index){ 
    $finalArray = &$finalArray[$index]; 
} 
$finalArray = $value; 
}); 


print_r($finalArray); 
+0

Danke, das macht den Trick. Ich werde das für jetzt offen lassen, aber ich werde es als die Antwort markieren, wenn niemand eine bessere Lösung findet. – nfplee

0

Eine andere Lösung

$delimiter = '_'; 
$result = []; 
foreach($array as $k => $v) 
{ 
    $split = explode($delimiter, $k, 2);//explode only as much as we need 
    if(count($split) > 1) 
    { 
     if(!isset($result[$split[0]])) 
     { 
      $result[$split[0]] = []; 
     } 
     //this assumes we're not interested in more than two depths 
     //in tandem with the explode limit 
     $result[$split[0]][$split[1]] = $v; 
    } 
    else 
    { 
     $result[$k] = $v; 
    } 
}