【问题标题】:CakePHP 3.8: How to use uasort() in a ControllerCakePHP 3.8:如何在控制器中使用 uasort()
【发布时间】: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";
 }
}

【问题讨论】:

  • 以什么方式不起作用?你有任何错误吗?行是否未正确排序?不保存结果吗?
  • 整个文件像以前一样未排序。
  • 你能告诉我们控制器的动作吗?
  • 如果您没有使用 cmp elswhere(而且您似乎没有使用),请直接在 uasort 中将其定义为匿名回调,然后重试。
  • 并不是说首先创建这样的函数是一个好主意,但是您正在命名空间中创建一个函数,并且没有在您传递给的名称中包含该命名空间uasort(),因此出现错误。

标签: php cakephp cakephp-3.0


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2013-08-20
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多