2013-05-13 26 views
1

任何人都可以请告知我是否可以写usort功能,将做在PHP中的以下内容:我可以将dirnames全局名称数组,然后通过文件值usort?

首先我有一堆目录的所有有内部的两个文件 - 这两个文件均包含了一些为纯文本

这是我想做的事:

glob的目录列表到一个数组呼叫$dirs

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

  1. 阅读每个目录下的两个文件(FILE1.TXT和FILE2.TXT)和它们相乘,以创建一个名为$值
  2. 排序原来的$迪尔斯阵列3号成为$价值降序每个目录。

好了 - 我可以使用通配的文件是这样的:

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

,我可以很容易地拉足够使用file_get_contents的值,但我无法弄清楚如何将所有的这组合成一个功能usort

+0

您可以使用intval对file_get_contents的返回值,只要它们是整数。我认为http://www.php.net/manual/en/function.usort.php上的例子并不难。最后,我希望这是一项任务,而不是现实世界的“数据库”。 – Adder 2013-05-13 15:54:17

+0

感谢您的帮助Adder - 那么,usort是否会多次调用该函数,如果有数百个目录需要过滤,会浪费多少时间?我会更好地循环访问由usort返回的第一个数组,并为每个目录只获取一次值,并使用dirname和值将其添加到另一个(多维)数组,然后使用第二个数组并将其添加到另一个(多维)数组中> – 2013-05-13 15:57:23

+0

是的,计算产品首先会更快。 – Adder 2013-05-13 15:59:48

回答

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

是不是只写'$ b ['value'] - $ a ['value'];'也是用PHP返回一个值,我只是熟悉其他语言的值? – Adder 2013-05-13 16:09:50

+0

非常感谢你!!!!!我无法注意到很容易忘记“返回”...... – mpyw 2013-05-13 16:38:41

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); 
0

假设你使用5.3.0或更高版本,您可以使用anonymous function来执行此操作。下面你会看到函数buildSort,它返回一个函数对象(由PHP调用一个“闭包”,虽然它在一些圈子里被很多人辩论,这个术语是否被正确应用。)我们将使用这个来“memoize” 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); 

是避免通过引用传递$值答案就留给为读者锻炼。 :)

相关问题