【发布时间】:2020-03-22 11:44:43
【问题描述】:
我正在尝试在 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 的控制器函数中运行它时,它以某种方式不起作用。 我认为这是因为“嵌套”功能。 有人知道如何让它在控制器内部工作吗?
提前致谢
更新
我得到的错误是
警告 (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";
}
}
【问题讨论】:
-
以什么方式不起作用?你有任何错误吗?行是否未正确排序?不保存结果吗?
-
整个文件像以前一样未排序。
-
你能告诉我们控制器的动作吗?
-
如果您没有使用
cmpelswhere(而且您似乎没有使用),请直接在uasort中将其定义为匿名回调,然后重试。 -
并不是说首先创建这样的函数是一个好主意,但是您正在命名空间中创建一个函数,并且没有在您传递给的名称中包含该命名空间
uasort(),因此出现错误。
标签: php cakephp cakephp-3.0