CakePHP 3.8:如何在控制器中使用 uasort()

CakePHP 3.8: How to use uasort() in a Controller

我正在尝试在 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 的控制器函数中尝试 运行 这个时,它不知何故不起作用。 我认为这是因为 "nested" 函数。 有人知道如何让它在控制器内部工作吗?

提前致谢

更新

我得到的错误是

Warning (2): uasort() expects parameter 2 to be a valid callback, function 'cmp' not found or invalid function name [APP/Controller/KeysController.php, line 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、"A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1"。所以,你可以用 uasort($otrkeys, [$this, 'cmp']);.