我可以将dirnames用于数组,然后按文件值进行操作吗?

时间:2013-05-13 15:48:51

标签: php glob usort

任何人都可以建议我是否可以为usort编写一个函数,以便在PHP中执行以下操作:

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

这是我想要做的:

将目录列表全局变为数组调用$dirs

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

  1. 读取每个目录中的两个文件(file1.txt和file2.txt)并将它们相乘以创建名为$ value的第三个数字
  2. 根据每个目录的$ value将原始$ dirs数组按降序排序。
  3. 好的 - 我可以像这样填充文件:

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

    我可以使用file_get_contents轻松地提取值,但我无法弄清楚如何将所有这些组合成usort的函数。

3 个答案:

答案 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);

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