как сначала отсортировать папки с помощью scandir и usort

Для управления файлами я использую create_function для сортировки папок (каталогов) сначала, а затем файлов. Но похоже, что create_function устарел в php 7.2.

Итак, как я могу правильно использовать usort ниже?

 $files = array_diff( scandir($dir), array(".", "..", "tmp") );

 usort ($files, create_function ('$a,$b', '
  return    is_dir ($a)
    ? (is_dir ($b) ? strnatcasecmp ($a, $b) : -1)
    : (is_dir ($b) ? 1 : (
        strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) == 0
        ? strnatcasecmp ($a, $b)
        : strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION))
    ))
  ;
'));

person mudraya katusha    schedule 11.05.2019    source источник
comment
Используйте анонимную функцию вместо create_function.   -  person Barmar    schedule 11.05.2019
comment
php.net/manual/en/functions.anonymous.php   -  person Barmar    schedule 11.05.2019
comment
@mud вы можете сравнивать массивы условий, используя оператор космического корабля. Вот пример: stackoverflow.com/a/56086562/2943403   -  person mickmackusa    schedule 11.05.2019
comment
Это работает нормально: usort ($files, function ($a,$b) { return is_dir ($a) ? (is_dir ($b) ? strnatcasecmp ($a, $b) : -1) : (is_dir ($b) ? 1 : ( strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) == 0 ? strnatcasecmp ($a, $b) : strcasecmp (pathinfo ($a, PATHINFO_EXTENSION), pathinfo ($b, PATHINFO_EXTENSION)) )) ; });   -  person mudraya katusha    schedule 11.05.2019