如何对数组元素进行分组?

问题描述

| 我有一组文件夹/路径:
$arr = Array
(
    0 => Array
         (
              \'name\' => \'aaa\'
         ),1 => Array
         (
              \'name\' => \'aaa\\bbb\'
        ),2 => Array
         (
              \'name\' => \'aaa\\bbb\\ccc\'
         ),3 => Array
         (
              \'name\' => \'ddd\'
         )
);
我想将其转换为多维(树状)数组(保留结构:索引/键和值/名称):
 aaa 
    bbb
       ccc
 ddd
有什么建议吗?     

解决方法

        尝试:
$arr = array(
   array(\'name\' => \'aaa\'),array(\'name\' => \'aaa\\bbb\'),array(\'name\' => \'aaa\\bbb\\ccc\'),array(\'name\' => \'ddd\'),array(\'name\' => \'ddd\\zzz\'),array(\'name\' => \'zzz\'),array(\'name\' => \'ddd\\zzz\\fff\'),);

$new = array();
$helper = array();
foreach ($arr as $i => $entry) {
    $parent =& $new;
    /**
     * One could use:
     *   explode(DIRECTORY_SEPARATOR,$entry[\'name\'])
     * 
     * instead of \'\\\\\' if you\'re dealing with file-structures
     */
    foreach ($path = explode(\'\\\\\',$entry[\'name\']) as $ii => $element) {
        $subPath = implode(\'.\',array_slice($path,$ii + 1));

        if (isset($helper[$subPath])) {
            $parent =& $helper[$subPath];
            continue;
        }

        $parent[$i] = array(\'name\' => $element);
        $helper[$subPath] =& $parent[$i];
    }
}

print_r($new);
输出:
Array
(
    [0] => Array
        (
            [name] => aaa
            [1] => Array
                (
                    [name] => bbb
                    [2] => Array
                        (
                            [name] => ccc
                        )

                )

        )

    [3] => Array
        (
            [name] => ddd
            [4] => Array
                (
                    [name] => zzz
                    [6] => Array
                        (
                            [name] => fff
                        )

                )

        )

    [5] => Array
        (
            [name] => zzz
        )

)
    ,        
$newarr=array();

foreach ($arr as $element) {
    $currentroot=$newarr;
    $pieces=explode(\'\\\\\',$element);
    for ($x=0; $x<=count($pieces); x++) {
        $currentroot[$pieces[$x]]=array();
        $currentroot=$currentroot[$pieces[$x]];
    }
}
未经测试,但应该可以帮助您入门。您需要添加一个条件来检查它是否为最后一块,并使其成为字符串值而不是数组。     ,        好吧,必须在两个函数中执行此操作,但是这里有:
// Directory Array to Hierarchy
function _DAtoH($path,$result = null)
{    
  if (empty($path))      return array();
  if (is_null($result))  $result = array();

  $path = explode(DIRECTORY_SEPARATOR,$path);
  $curr = array_shift($path);
  if (!isset($result[$curr]))
    $result[$curr] = array();
  $result[$curr] = _DAtoH(implode(DIRECTORY_SEPARATOR,$path),$result[$curr]);
  return $result;
}
function DAtoH($arr)
{
  $result = array();
  foreach ($arr as $a)
    $result = _DAtoH($a,$result);
  return $result;
}
将您在原始问题(
var_dump(DAtoH($arr));
)中指定的数组传递给底部函数(_DAtoH只是一个递归帮助器),您应该收到:
array(2) {
  [\"aaa\"]=>
  array(2) {
    [\"bbb\"]=>
    array(1) {
      [\"ccc\"]=>
      array(0) {
      }
    }
    [\"fff\"]=>
    array(0) {
    }
  }
  [\"ddd\"]=>
  array(1) {
    [\"eee\"]=>
    array(0) {
    }
  }
} (注意:我添加了一些文件夹路径只是为了对其进行测试,因此添加了fff,eee等)     ,        对于新要求:
$arr = array(
   array(\'name\' => \'aaa\'),);

function traverse(array $array) {
    $mark=array_shift($array);
    return array($mark => $array ? traverse($array) : array() );
}

$out = array();
foreach($arr as $path)
{
    ($add=traverse(explode(\'\\\\\',$path[\'name\'])))
        && $out[key($add)]=current($add)
        ;
}
输出:
array(2) {
  [\"aaa\"]=>
  array(1) {
    [\"bbb\"]=>
    array(1) {
      [\"ccc\"]=>
      array(0) {
      }
    }
  }
  [\"ddd\"]=>
  array(0) {
  }
}
旧问题: 旧问题有以下要求:
$arr = array(
   0 => \'aaa\',1 => \'aaa\\bbb\',2 => \'aaa\\bbb\\ccc\',);

function traverse(array $array) {
    $mark=array_shift($array);
    return $array ? array($mark => traverse($array)) : $mark;
}

$out = array();
foreach($arr as $path)
{
    is_array($add=traverse(explode(\'\\\\\',$path)))
        && $out[key($add)]=current($add)
        ;
}
经过测试,给出以下输出:
array(1) {
  [\"aaa\"]=>
  array(1) {
    [\"bbb\"]=>
    string(3) \"ccc\"
  }
}