2015-09-03 56 views
-2

您好,我有数组这样的可变深度:如何格式化多维数组

$array = [ // depth of array and number of values are variable 
    'this' => [ 
     'a' => [ 
      'b' => 'some value' 
     ], 
     'c' => [ 
      'd' => 'some value' 
     ], 
    ], 
    'that' => [ 
     'path' => [ 
      'to' => [ 
       'val' => 'some value' 
      ], 
     ] 
    ] 
]; 

,我需要有这样的:

$array['this.a.b'] => 'some value'; 
$array['this.c.d'] => 'some value'; 
$array['that.path.to.val'] => 'some value'; 

或本可以更好:

$array[ 
0 => [ 
    'key' => 'this.a.b', 
    'val' => 'some value' 
], 
1 => [ 
    'key' => 'this.c.d', 
    'val' => 'some value' 
], 
2 => [ 
    'key' => 'that.path.to.val', 
    'val' => 'some value' 
], 
] 

我需要从数组中获取数据,并将它们设置为如下形式:

<input name="this.a.b" value="some value"> 

我试过类似的东西,但效果不好。

private static function reformat($input, $k = '', &$keys = []) 
{ 
    foreach($input as $key => $val) { 
     $k .= '.' . $key; 
     if (is_array($val)){ 
      static::reformat($val, $k, $keys); 
     }else{ 
      $keys[$k] = $val; 
     } 
    } 

    return $keys; 
} 

感谢您的帮助

+0

发布您的尝试。发布您的预期结果 –

回答

0

我找到了想要的解决方案,那就是:

function shorten($inputArray, $path = null, $separator = ".") 
{ 

    $data = array(); 
    if (!is_null($path)) { 
     $path = $path . $separator; 
    } 

    if (is_array($inputArray)) { 
    foreach ($inputArray as $key => &$value) { 
     if (!is_array($value)) { 
      $data[$path . $key] = $value; 
     } else { 
      $data = array_merge($data, shorten($value, $path . $key, $separator)); 
     } 
    } 
    } 

    return $data; 
} 

输出

Array 
(
    [this.a.b] => some value 
    [this.c.d] => some value 
    [that.path.to.val] => some value 
) 

Demo

0

试试这个

$array['this']['a']['b']; 
$array['this']['c']['d']; 
$array['this']['path']['to']['val']; 

function getVal($array, $key, $d='.') { 
     $keyArray = explode($d, $key); 
     $value = $array; 
     foreach($keyArray as $k){ 
      if(isset($value[$k])) 
       $value = $value[$k]; 
      else { 
       $value = ""; 
       break; 
      } 
     } 
     return $value; 
    } 


    echo getVal($array, 'this.path.to.val'); 
+0

我需要获取关联路径val => val – Jack

0

你可以让你的用户定义函数作为

$array = [ 
    'this' => [ 
     'a' => [ 
      'b' => 'some value' 
     ], 
     'c' => [ 
      'd' => 'some value' 
     ], 
    ], 
    'that' => [ 
     'path' => [ 
      'to' => [ 
       'val' => 'some value' 
      ], 
     ] 
    ] 
]; 

function makesingledimesional($arr,$par = ''){ 
    $result = []; 
    $final = []; 
    foreach($arr as $key => $value){ 
     if(is_array($value) && count($value)>0){ 
      $par .= "$key."; 
      $result[$par] = makesingledimesional($value,$par); 
     }else{ 
      $result[$par.$key] = $value; 
     } 

    } 
    array_walk_recursive($result,function($v,$k)use(&$final){$final[$k] = $v;}); 
    return $final; 
} 

print_r(makesingledimesional($array)); 

输出:

Array 
(
    [this.a.b] => some value 
    [this.a.c.d] => some value 
    [this.that.path.to.val] => some value 
) 

Demo

+0

这很糟糕,因为第二个键应该只有this.c.d,而下一个键只有that.path.to.val。我的功能做了同样的问题。 – Jack