使用更简单的PHP数组中的键创建多维数组

时间:2010-11-17 03:41:20

标签: php arrays multidimensional-array

我有一个文档数组,其中每个文档都有另一个简单的一维facet数组(附加到文档的简单文本标签),它们的顺序具有结构值(0从最近的根到边缘)。我正在遍历这个数组,并且想要创建一个多维数组,就像树结构一样。所以,只有其中一个文件的片段;

Array ( 'document-001' => Array (
   Array ( 'facets' => array (
      'Public - Policy and Procedures',
      'Employment Services Manual',
      'Section 02 - Recruitment & Selection',
   )
   ... many more here ...
) ;

我想要这个;

Array
(
    [Public - Policy and Procedures] => Array (
            [Administration Manual] => Array ( )
            [Corporate Governance Manual] => Array ( )
            [Food Services Manual] => Array ( )
            [Charter Manual] => Array ( )
            [Infection Control Manual] => Array ( )
            [Leisure and Lifestyle Manual] => Array ( )
            [Employment Services Manual] => Array (
                    [Section 09 - Termination & Resignation] => Array ( )
                    [Section 02 - Recruitment & Selection] => Array ( )
                    [Section 10 - Security] => Array ( )
            )
            [Environmental Sustainability Manual] => Array (
                    [Property - New Development & Refurbishment Policy 5.5] => Array ( )
            )
     )

我目前的解决方案非常不优雅,其中$ index是我新的多维数组;

// Pick out the facets array from my larger $docs array
$t = $docs['facets'] ;
$c = count ( $t ) ;

if      ( $c == 2 ) $index[$t[0]] = array() ;
else if ( $c == 3 ) $index[$t[0]][$t[1]] = array() ;
else if ( $c == 4 ) $index[$t[0]][$t[1]][$t[2]] = array() ;
else if ( $c == 5 ) $index[$t[0]][$t[1]][$t[2]][$t[3]] = array() ;
else if ( $c == 6 ) $index[$t[0]][$t[1]][$t[2]][$t[3]][$t[4]] = array() ;
else if ( $c == 7 ) $index[$t[0]][$t[1]][$t[2]][$t[3]][$t[4]][$t[5]] = array() ;

当然有更好的方法。我已经厌倦了各种数组函数,但没有什么是显而易见的解决方案。这里的问题是动态主义与PHP本身的语法作斗争。我当然可以创建一个OO解决方案,但这是一个如此简单的小遍历,我真的不想去那里(即使我可能应该)。

思想?

1 个答案:

答案 0 :(得分:2)

只需使用一些递归:

function bar($source, $dest){
    if(count($source) == 0){
        return array();
    }
    $dest[$source[0]] = bar(array_slice($source, 1), $dest[$source[0]]);
    return $dest;
}

$t = $docsA['facets'];
$s = $docsB['facets'];

$index = array();
$index = bar($t, $index);
$index = bar($s, $index);