Торт PHP 3.8: Как использовать uasort () в контроллере - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь использовать функцию uasort () в Cake PHP Controller.

У меня есть текстовый файл, содержащий имя файла в каждой строке. Имя файла имеет формат 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>";
}
?>

Когда я пытаюсь запустить это в функции контроллера в Cake PHP, это как-то не работает. Я предполагаю, что это из-за «вложенной» функции. Кто-нибудь знает, как заставить это работать внутри контроллера?

Заранее спасибо

ОБНОВЛЕНИЕ

Я получаю ошибку

Предупреждение (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";
 }
}

1 Ответ

0 голосов
/ 22 марта 2020

Хотя предложение @ El_Vanja сработает, оно не совсем идеально, если вам необходимо повторно использовать эту же функцию в нескольких действиях контроллера.

Согласно документации для вызываемых элементов , «Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода с индексом 1». Таким образом, вы можете сделать это с uasort($otrkeys, [$this, 'cmp']);.

...