Php 比较值并检查重复项
我面临一个问题,我希望有一个输出告诉我哪些文件具有相同的inode,例如“filename1和filename2是相同的”。如果两个inode是相同的,这将是相同的,但是我不知道如何应用它。我目前正在尝试创建一个数组,其中键是文件名,值是inode,但它不起作用(var_dump只是给了我一个空数组) 如果我以某种方式让数组工作,那么我猜我需要以某种方式递增数组,检查两个值是否相同,然后打印它们的键Php 比较值并检查重复项,php,arrays,Php,Arrays,我面临一个问题,我希望有一个输出告诉我哪些文件具有相同的inode,例如“filename1和filename2是相同的”。如果两个inode是相同的,这将是相同的,但是我不知道如何应用它。我目前正在尝试创建一个数组,其中键是文件名,值是inode,但它不起作用(var_dump只是给了我一个空数组) 如果我以某种方式让数组工作,那么我猜我需要以某种方式递增数组,检查两个值是否相同,然后打印它们的键 global $hardlink; $hardlink = []; f
global $hardlink;
$hardlink = [];
foreach (glob("*") as $filename) {
file_info($filename);
print_file_info();
}
var_dump($hardlink);
exit(0);
function file_info($name) {
global $info;
$info[0] = $name; // the file name
$info[1] = filesize($name); // file size
$info[2] = filetype($name); // file type
$cwd = getcwd();
$path = "$cwd/$name";
if(is_link($path)) {
$link = readlink($path);
$info[3] = "-> $link";
} else {
$info[3] = "No link";
}
$lstat = lstat($path);
$info[4] = $lstat[1];
$hardlink[$info[0]] = $info[4];
}
尝试将
$hardlink
添加到函数的全局行:
function file_info($name) {
global $info, $hardlink;
您的变量范围存在一般性问题。这是您不应该依赖globals的众多原因之一
$hardlink
是函数文件_info()中的局部变量,不是全局变量,因此您所做的任何更改都不会在全局范围内显示
要更好地解决此问题,请去掉全局声明并传递引用
$hardlink = [];
foreach (glob("*") as $filename) {
file_info($filename, $hardlink);
print_file_info();
}
function file_info($name, &$hardlink) {
$info[0] = $name; // the file name
$info[1] = filesize($name); // file size
$info[2] = filetype($name); // file type
$cwd = getcwd();
$path = "$cwd/$name";
if(is_link($path)) {
$link = readlink($path);
$info[3] = "-> $link";
} else {
$info[3] = "No link";
}
$lstat = lstat($path);
$info[4] = $lstat[1];
$hardlink[$info[0]] = $info[4];
}
请注意,我在file_info函数的第二个参数中将$hardlink定义为一个引用,在它前面加了一个有效的
&
,非常感谢。如果可能的话,你能建议我如何检查这两个文件索引节点并打印出相同值的键吗?类似数组的东西?因此,我可以输出“这些文件拥有相同的索引节点:filename1,filename2”@Xylus,这超出了问题的范围,如果您无法理解,请打开一个新问题。PHP手册中有很多示例,但我希望您也能阅读并理解我的答案。如果你想写出好的代码,你将完全避免使用全局代码。@Devon再次感谢你。我将查看PHP手册,并尝试自己解决这个问题。