任何人都可以建议我是否可以为usort
编写一个函数,以便在PHP中执行以下操作:
首先,我有一堆目录,里面都有两个文件 - 这两个文件都包含一个数字作为纯文本
这是我想要做的:
将目录列表全局变为数组调用$dirs
使用usort
函数执行以下操作:
好的 - 我可以像这样填充文件:
$dirs = glob('*',GLOB_NOSORT|GLOB_ONLYDIR);
我可以使用file_get_contents
轻松地提取值,但我无法弄清楚如何将所有这些组合成usort
的函数。
答案 0 :(得分:1)
试试这个:
<?php
$dirs = array();
foreach (glob('*',GLOB_NOSORT|GLOB_ONLYDIR) as $dir) {
$value =
(int)file_get_contents($dir.'/file1.txt') *
(int)file_get_contents($dir.'/file2.txt') ;
$dirs[] = array(
'path' => $dir,
'value' => $value,
);
}
usort($dirs, function($a, $b) {
return $b['value'] - $a['value'];
});
然后你想获得一维结果,
$dirs = array_map(function ($dir) {
return $dir['path'];
}, $dirs);
答案 1 :(得分:0)
以下代码段可以解决问题:
$dirs = glob('*',GLOB_NOSORT|GLOB_ONLYDIR);
usort($dirs, function ($a, $b) {
$val_a = $val_b = 1;
foreach(scandir($a) as $file) {
if(strpos($file, '.') === 0) {
continue;
}
$val_a *= intval(trim(file_get_contents($a. '/' . $file)));
}
foreach(scandir($b) as $file) {
if(strpos($file, '.') === 0) {
continue;
}
$val_b *= intval(trim(file_get_contents($b. '/' . $file)));
}
if($val_a === $val_b) {
return 0;
} else if($val_a > $val_b) {
return 1;
} else {
return -1;
}
});
var_dump($dirs);
答案 2 :(得分:0)
假设您使用的是5.3.0或更高版本,则可以使用anonymous function执行此操作。下面你会看到函数buildSort
,它返回一个函数对象(由PHP调用“闭包”,尽管在某些圈子中是否正确地应用了这个术语。)我们将使用它来“记忆” “读取dir / file1.txt和dir / file2.txt,以及数学运算,所以我们只需要为每个目录执行一次:
<?php
function buildSort(&$values) {
return function ($a, $b) use(&$values) {
if (!isset($values[$a])) {
$values[$a] = file_get_contents($a.'/file1.txt')*
file_get_contents($a.'/file2.txt');
}
if (!isset($values[$b])) {
$values[$b] = file_get_contents($b.'/file1.txt')*
file_get_contents($b.'/file2.txt');
}
return strcmp($values[$a], $values[$b]);
};
}
$dirs = glob('*',GLOB_NOSORT|GLOB_ONLYDIR);
$values = array();
$sort = buildSort($values);
usort($dirs, $sort);
var_dump($dirs);
避免通过引用传递$值的答案留给读者练习。 :)