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

问题描述 投票:0回答:1

我正在尝试在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";
 }
}
php cakephp cakephp-3.0
1个回答
0
投票

虽然@El_Vanja的建议会起作用,但在需要在多个控制器操作中重复使用相同功能的情况下,它并不理想。

[documentation on callables,“将实例化对象的方法作为包含索引为0的对象和索引为1的方法名称的数组传递”。因此,您可以使用uasort($otrkeys, [$this, 'cmp']);执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.