2012-05-08 60 views
1

我有嵌套结构非常相似的文件夹结构,如:转换嵌套结构,扁平键值对

Array 
(
    [level_one_1] => Array 
     (
      [level_two_1] => value1 
      [level_two_2] => valuetwo 
      [level_two_3] => value_three 
     ) 
    [level_one_2] => Array 
     (
      [level_two_4] => value1 
      [level_two_5] => valuetwo 
      [level_two_6] => value_three 
     ) 
    [level_one_3] => Array 
     (
      [level_two_2] => valuetwo 
      [level_two_3] => value_three 
     ) 
) 

它是一个快速的方法把它隐蔽的东西是这样的:

Array 
(
    [level_one_1/level_two_1] => value1 
    [level_one_1/level_two_2] => valuetwo 
    [level_one_1/level_two_3] => value_three 

    [level_one_2/level_two_4] => value1 
    [level_one_2/level_two_5] => valuetwo 
    [level_one_2/level_two_6] => value_three) 

    [level_one_3/level_two_2] => valuetwo 
    [level_one_3/level_two_3] => value_three 
) 

级别之间的斜线将是分隔符 - 它可以是任何东西。此外,它将是动态的数量级别。

这是通过使用预定义的数组*函数的方式吗?递归?

+2

您需要这样做的任何理由?一旦你转换到平坦的结构,你只是使它更难以访问任何东西。 –

回答

1

就是这样。未经测试,但应帮助您开始正确的方向:

$myArray = array(
'level_one_1' => array(
     'level_two_1' => 'value1', 
     'level_two_2' => 'valuetwo', 
     'level_two_3' => 'value_three' 
), 
'level_one_2' => array(
     'level_two_4' => 'value1', 
     'level_two_5' => 'valuetwo', 
     'level_two_6' => 'value_three' 
), 
'level_one_3' => array(
     'level_two_2' => 'valuetwo', 
     'level_two_3' => 'value_three' 
)); 
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray)); 
$result = array(); 
foreach ($ritit as $leafValue) { 
    $keys = array(); 
    foreach (range(0, $ritit->getDepth()) as $depth) { 
     $keys[] = $ritit->getSubIterator($depth)->key(); 
    } 
    $result[ join('/', $keys) ] = $leafValue; 
} 
+0

尽管我同意Marc B.扁平化阵列可能会让您更难以浏览数据。 – maiorano84