基于路径动态创建多维数组

时间:2015-07-04 19:47:08

标签: php arrays multidimensional-array

所以我有一个路径列表,例如:

path/to/directory/file1
path/directory/file2
path2/dir/file3
path2/dir/file4

我想把它们转换成像这样的多维数组:

array(
  path => array(
    to => array(
      directory => array(
        file1 => someValue
      ),
    ),
    directory => array(
      file2 => someValue
    ),
  ),
  path2 => array(
    dir => array(
      file3 => someValue,
      file4 => someValue
    )
  )
)

我的第一个想法是将路径分解成段并使用foreach循环设置数组,如下所示:

$arr = array();
foreach ( $path as $p ) {
    $segments = explode('/', $p);
    $str = '';
    foreach ( $segments as $s ) {
        $str .= "[$s]";
    }
    $arr{$str} = $someValue;
}

但是这不起作用,而且由于段数不同,我有点难过。有没有这样做?

4 个答案:

答案 0 :(得分:1)

如果somevalue可以是空数组:

<?php
$result = array();

$input = [
    'path/to/directory/file1',
    'path/directory/file2',
    'path2/dir/file3',
    'path2/dir/file4',
];

foreach( $input as $e ) {
    nest( $result, explode('/', $e));
}

var_export($result);


function nest(array &$target, array $parts) {
    if ( empty($parts) ) {
        return;
    }
    else {
        $e = array_shift($parts);
        if ( !isset($target[$e]) ) {
            $target[$e] = [];
        }
        nest($target[$e], $parts);
    }
}

答案 1 :(得分:0)

这是解决方案和简单方法
只需反转整个爆炸数组,然后开始在数组

中创建数组
$path[1] = "path/to/directory/file1";
$path[2] = "path/directory/file2";
$path[3] = "path2/dir/file3";
$path[4] = "path2/dir/file4";
$arr = array();
$b = array();
$k = 0;
foreach($path as $p) {

$c = 0;
$segments = explode('/', $p);
$reversed = array_reverse($segments);
foreach($reversed as $s) {
if ($c == 0) {
  $g[$k] = array($s => "somevalue");

} else {

  $g[$k] = array($s => $g[$k]);
}

$c++;
}
$k++;

}
var_dump($g);

答案 2 :(得分:0)

非常感谢VolkerK!你的答案并没有完全回答我的问题,但它让我走上正轨。这是我最终用来使它工作的版本:

$result = array();

$input = [
    'path/to/directory/file1' => 'someValue',
    'path/directory/file2' => 'someValue',
    'path2/dir/file3' => 'someValue',
    'path2/dir/file4' => 'someValue',
];

foreach( $input as $e=>$val ) {
    nest( $result, explode('/', $e), $val);
}

var_export($result);

function nest(array &$target, array $parts, $leafValue) {

    $e = array_shift($parts);

    if ( empty($parts) ) {
        $target[$e] = $leafValue;
        return;
    }

    if ( !isset($target[$e]) ) {
        $target[$e] = [];
    }

    nest($target[$e], $parts, $leafValue);
}

我基本上只是将somevalue添加为$leafValue并移动了基本情况,以便在末尾添加leafValue而不是空白数组。

这导致:

Array
(
    [path] => Array
        (
            [to] => Array
                (
                    [directory] => Array
                        (
                            [file1] => someValue
                        )
                )
            [directory] => Array
                (
                    [file2] => someValue
                )
        )
    [path2] => Array
        (
            [dir] => Array
                (
                    [file3] => someValue
                    [file4] => someValue
                )
        )
)

非常感谢!

答案 3 :(得分:0)

可以在没有递归的情况下完成

$path = array(
'path/to/directory/file1',
'path/directory/file2',
'path2/dir/file3',
'path2/dir/file4');

$arr = [];
$someValue = 'someValue';

foreach ( $path as $p ) {
    $segments = explode('/', $p);
    $str = '';
    $p = &$arr;
    foreach ( $segments as $s ) {
        if (! isset($p[$s] ) ) $p[$s] = array();
        $p = &$p[$s];
    }
    $p = $someValue;
}

print_r($arr);