数组上删除子目录函数的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);