Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组上删除子目录函数的PHP方法_Php_Algorithm - Fatal编程技术网

数组上删除子目录函数的PHP方法

数组上删除子目录函数的PHP方法,php,algorithm,Php,Algorithm,我创建了一个函数,用于删除数组结构上的子目录。对于错误或错误,用户已在配置列表中放置了父目录的子目录 /dir_a/subdir_a /dir_b/subdir_a/subdir_a /dir_b/subdir_a/subdir_b /dir_b/ /dir_c/subdir_a/ ... 代码 排序OK /dir_a/subdir_a /dir_b/ /dir_c/subdir_a/ 我认为这是一个不好的编程。工作,但不好。依我拙见对最好的代码有什么想法吗 排序是一条路要走。请注意,排序时

我创建了一个函数,用于删除数组结构上的子目录。对于错误或错误,用户已在配置列表中放置了父目录的子目录

/dir_a/subdir_a
/dir_b/subdir_a/subdir_a
/dir_b/subdir_a/subdir_b
/dir_b/
/dir_c/subdir_a/
...
代码

排序OK

/dir_a/subdir_a
/dir_b/
/dir_c/subdir_a/

我认为这是一个不好的编程。工作,但不好。依我拙见对最好的代码有什么想法吗

排序是一条路要走。请注意,排序时,所有子子子对象将立即位于其父对象之后。因此,如果最后添加的dir有一个公共前缀,那么只需避免添加subdir

PHP不是我的第一语言,所以请不要介意这些非惯用代码

$local_sync = [
    "/dir_a/subdir_a",
    "/dir_b/subdir_a/subdir_a",
    "/dir_b/subdir_a/subdir_b",
    "/dir_b/",
    "/dir_c/subdir_a/"
];

$copy = $local_sync;
asort($copy);
$output = array();

foreach ($copy as $value)
    if (strpos($value, end($output)) !== 0) 
       $output[] = $value;

print_r($output)

最好不要依赖于数组的结构,不要依赖于正在排序的数组或当前路径与前一路径之间的比较。您要做的是使用
dirname()
获取每个路径的目录名,并在输出数组中搜索每个路径,如果该路径不在输出数组中,则仅将其添加到输出数组中

就像这样

$directory_paths = array (
    '/dir_a/subdir_a',
    '/dir_b/subdir_a/subdir_a',
    '/dir_b/subdir_a/subdir_b',
    '/dir_b/',
    '/dir_c/subdir_a/'
);

$sorted_paths = $directory_paths;
asort ($sorted_paths);
$output = array ();

foreach ($sorted_paths as $key => $path) {
    $directory = $path;
    $levels = substr_count (trim ($path, '/'), '/') - 1;

    for ($i = 0; $i < $levels; $i++) {
        $directory = dirname ($directory);
    }

    if (in_array ($directory, $sorted_paths)) {
        $output[$key] = $path;
    }
}

ksort ($output);
$output = array_values ($output);

echo print_r ($output, true);
$directory\u path=array(
“/dir\u a/subdir\u a”,
“/dir_b/subdir_a/subdir_a”,
“/dir_b/subdir_a/subdir_b”,
“/dir_b/”,
“/dir_c/subdir_a/”
);
$sorted_path=$directory_path;
asort($sorted_path);
$output=array();
foreach($key=>$path的排序路径){
$directory=$path;
$levels=substr_计数(修剪($path,“/”),“/”)-1;
对于($i=0;$i<$levels;$i++){
$directory=dirname($directory);
}
if(在数组中($directory,$sorted\u path)){
$output[$key]=$path;
}
}
k港口(产出);
$output=数组_值($output);
回波打印(输出,真);

您是否尝试过使用.htacess文件?(以防你使用Apache?)Apache毫无疑问。它是一个数组(获取两个文件的信息)。arry的内容可以有重复的dir或subdir在数组上形成另一个dir。对于
$directory\u paths=array('/dir\u b/subdir\u a/subdir\u a','/dir\u b/subdir\u a/subdir\u b','/dir\u a/subdir\u b/,'/dir\u c/subdir\u a/)
您的算法返回错误的结果。
/dir\u a/subdir\u a
在技术上是一个子目录,因此它的父目录包含在内。关于算法的问题是,它们必须有某种逻辑,“删除所有子目录”是上述算法的逻辑。添加允许的子目录数量限制将使您获得所需的行为,因此我编辑了代码来实现这一点。您包含的目录未包含在原始数组中。我很确定这不是OP要求的。@JuanLopes很公平。我已经修改了密码,非常感谢。您的代码非常漂亮,我从中了解到了通过引用传递的end和argument的正确用法。
$directory_paths = array (
    '/dir_a/subdir_a',
    '/dir_b/subdir_a/subdir_a',
    '/dir_b/subdir_a/subdir_b',
    '/dir_b/',
    '/dir_c/subdir_a/'
);

$sorted_paths = $directory_paths;
asort ($sorted_paths);
$output = array ();

foreach ($sorted_paths as $key => $path) {
    $directory = $path;
    $levels = substr_count (trim ($path, '/'), '/') - 1;

    for ($i = 0; $i < $levels; $i++) {
        $directory = dirname ($directory);
    }

    if (in_array ($directory, $sorted_paths)) {
        $output[$key] = $path;
    }
}

ksort ($output);
$output = array_values ($output);

echo print_r ($output, true);