我正在尝试在CakePHP控制器中使用uasort()函数。
我有一个txt文件,每行包含一个文件名。文件名的格式为SOME_TEXT_YY.MM.DD_HH-MM_SOME_TEXT我想在给定的日期之后对文件进行排序并再次保存,因此我编写了此php代码,该代码可以使用纯PHP正常工作:
<?
// compare function
function cmp($a, $b) {
$a1 = explode('-', $a);
$a2 = explode('S', $a1[1]);
$ac = substr($a1[0], -11,11).$a2[0];
$b1 = explode('-', $b);
$b2 = explode('S', $b1[1]);
$bc = substr($b1[0], -11,11).$b2[0];
if ($ac == $bc) {
return 0;
}
return ($ac < $bc) ? -1 : 1;
}
$files = file("files.txt");
uasort($files, 'cmp');
file_put_contents('sorted.txt', $files);
foreach ($files as $line) {
echo $line."</br>";
}
?>
[当我试图在CakePHP的Controller Function中运行它时,它不起作用。我认为这是因为“嵌套”功能。有人知道如何使它在Controller内部工作吗?
提前感谢
UPDATE
我得到的错误是
警告(2):uasort()期望参数2是有效的回调,未找到函数'cmp'或无效的函数名称[APP / Controller / KeysController.php,第123行]
class KeysController extends AppController {
[...]
public function update() {
$dir = WWW_ROOT . 'data';
$files_filename = $dir . DS . "files.txt";
function cmp($a, $b) {
$a1 = explode('-', $a);
$a2 = explode('TVOON_DE', $a1[1]);
$ac = substr($a1[0], -11,11).$a2[0];
$b1 = explode('-', $b);
$b2 = explode('TVOON_DE', $b1[1]);
$bc = substr($b1[0], -11,11).$b2[0];
if ($ac == $bc) {
return 0;
}
return ($ac < $bc) ? -1 : 1;
}
$otrkeys = file($files_filename);
uasort($otrkeys, 'cmp');
file_put_contents($files_filename, $otrkeys);
echo "sortiert";
}
}
虽然@El_Vanja的建议会起作用,但在需要在多个控制器操作中重复使用相同功能的情况下,它并不理想。
[documentation on callables,“将实例化对象的方法作为包含索引为0的对象和索引为1的方法名称的数组传递”。因此,您可以使用uasort($otrkeys, [$this, 'cmp']);
执行此操作。