1

谁能告诉我是否可以为此编写一个函数usort,它将在 PHP 中执行以下操作:

首先,我有一堆目录,里面都有两个文件——这两个文件每个都包含一个纯文本数字

这是我想做的:

将目录列表全局化到数组调用中$dirs

使用usort函数执行以下操作:

  1. 读取每个目录中的两个文件(file1.txt 和 file2.txt)并将它们相乘以创建一个名为 $value 的第三个数字
  2. 按每个目录的 $value 对原始 $dirs 数组进行降序排序。

好的 - 我可以像这样 glob 文件:

$dirs = glob('*',GLOB_NOSORT|GLOB_ONLYDIR); 

我可以很容易地使用这些值来提取值,file_get_contents但我不知道如何将所有这些组合成一个函数usort

4

3 回答 3

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);
于 2013-05-13T16:04:37.613 回答
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);
于 2013-05-13T16:06:29.260 回答
0

假设您使用的是 5.3.0 或更高版本,您可以使用匿名函数来执行此操作。下面你会看到 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);

避免通过引用传递 $values 的答案留给读者作为练习。:)

于 2013-05-14T14:09:09.827 回答