簡體   English   中英

如何在數組中創建層次結構?

[英]How to create hierarchy in array?

我知道我的問題描述得不好,但是我想創建一個“嵌套數組”,如下所示:

文件夾/->文件夾/file.txt,文件夾/文件夾2 /->文件夾/文件夾2 / file.txt,文件夾/文件夾2 /文件夾3 /->等等

但是,我得到了:

E:\wamp\www\index.php:31:
array (size=3)
  'folder/' => 
    array (size=1)
      0 => string 'folder/file.txt' (length=15)
  'folder/folder2/' => 
    array (size=1)
      0 => string 'folder/folder2/file.txt' (length=23)
  'folder/folder2/folder3/' => 
    array (size=1)
      0 => string 'folder/folder2/folder3/file.txt' (length=31)

我的代碼是:

$array = [
    'folder/',
    'folder/folder2/folder3/',
    'folder/folder2/',
    'folder/folder2/folder3/file.txt',
    'folder/folder2/file.txt',
    'folder/file.txt'
];
sort($array);
$array = array_flip($array);
function recursive_dir_nested($a) {
    foreach ($a as $k => $v) {
        if (preg_match("/\/$/", $k)) {
            $a[$k] = [];
        }

        if (preg_match("/\/[^\/]+$/", $k)) {
            $nk = preg_replace("/\/[^\/]+$/", "/", $k);
            if (array_key_exists($nk, $a)) {
                $a[$nk][] = $k;
                unset($a[$k]);
            } else {
                recursive_dir_nested($a);
            }
        }
    }

    return $a;
}

我知道我做錯了,我不確定為什么...我該如何解決?

不確定使用正則表達式是否是最好的方法。 這基於另一個答案-PHP-從定界的字符串中創建多維關聯數組 ,但增加了使用條目數組的想法。 需要注意的一件事是,當添加新條目時,如果該元素當前不是數組,它將變成一個數組,以便它可以包含多個條目( if ( !is_array($current) ) {部分)。

它使用每個字符串並從中構建文件夾層次結構,將最后一部分另存為文件名,以專門添加到文件夾元素中。

$array = [
    'folder/',
    'folder/folder2/folder3/',
    'folder/folder2/',
    'folder/folder2/folder3/file.txt',
    'folder/folder2/file.txt',
    'folder/file.txt'
];
sort($array);

$output = [];
foreach ( $array as $entry )   {
    $split = explode("/", $entry);
    $current = &$output;
    $file = array_pop($split);
    foreach ( $split as $level )    {
        if ( !isset($current[$level]) ){
            if ( !is_array($current) )  {
                $current = [ $current ];
            }
            $current[$level] = [];
        }
        $current = &$current[$level];
    }
    if ( !empty($file) )    {
        $current = $file;
    }
}

print_r($output);

這給你...

Array
(
    [folder] => Array
        (
            [0] => file.txt
            [folder2] => Array
                (
                    [0] => file.txt
                    [folder3] => file.txt
                )

        )

)

您可以在PHP中嵌套數組。 您可能還想使用鍵作為目錄名稱:

$array = [
    'folder' => [
        'folder2' => [
            'folder3' => [
                'file.txt'
            ],
            'file.txt'
        ],
        'file.txt'
    ]
];

您可以使用is_array()檢查每個項目以查看其本身是否為數組,如果不是,則將其視為字符串。

參見此處了解更多信息:php.net/manual/en/language.types.array.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM