根据文件的最后两个字符对文件进行排序

时间:2018-08-16 04:55:26

标签: php html smarty3

我使用一些Smarty代码从文件夹中收集文件:

{assign var=files value="uploads/Documenten/GPS-Tracks/*.html"|glob}

{if count($files)}
    <ul>
        {foreach from=$files item='file'}
            {assign var='gpstrack_location' value="{$file|cms_escape:'urlpathinfo'}"}
            {if !$file|contains:"index"}
                <li><a href="{$file}">{$file|basename|substr:0:-5}</a></li>
            {/if}
        {/foreach}
    </ul>
{/if}

这给了我一个基于第一个字符的排序列表。

  • Brighton-Gosport_2108
  • Brighton-Littlehampton_2012
  • 布莱顿-波特茅斯-布莱顿_2018
  • Bruinisse-Herkingen_2012
  • BurnhamonCrouch_Vlissingen_22aug13
  • Calais-Dieppe_2014
  • Carteret-Dielette_2012
  • Cherbourg-StVaast_2012
  • Clubwedstrijd_17sept11
  • Clubwedstrijd_18sep10
  • Clubwedstrijd_21sep13
  • Cowes-BeauLieu_River_2012
  • Dartmouth-Guernsey_2012
  • Deauville-Honfleur_2012
  • Denemarken_2008
  • Dielette-Alderney_2012
  • Dieppe-Boulogne_2012

我想实现的是基于最后两个字符的排序列表。在Smarty或PHP中可以做到这一点吗?

在此先感谢您的帮助!

更新: 我进一步做了两步:)仍然有一个我无法解决的警告: 到目前为止的代码:

<?php

    $folder = '<some foldername>';

    $files = array_values(preg_grep('/^([^.])/', scandir($folder, SCANDIR_SORT_ASCENDING)));
    //$files = scandir($folder);

    //print_r($files);

    usort(var_dump($files, function ($a, $b){
        if ($a || $b <> "")
            return substr($b, strlen($b) - 2) - substr($a, strlen($a) - 2);
    }));
?>

我得到的警告,并认为可以通过“或”语句解决:

[

  • 121] =>字符串(29)“ Weymouth-Lyme_Reges_2012.html”
  • [122] =>字符串(24)“ Yarmouth-Poole_2012.html”}
  • object(Closure)#1036(1){[“ parameter”] => array(2){[“ $ a”] => string(10)“” [“ $ b”] => string(10 )“”}}警告:usort()恰好需要2个参数,第55行的/Users/name/Sites/install/assets/udt/sort-on-last-characters.php中给出了1个参数

有人可以让我更进一步吗?

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

<?php
$files = glob($folder.$file_name);
$current_year = date('y');
if (
    usort($files, function($a, $b) {
        $yearA = (int) substr($a, -7); // extension + . + last two characters
        $yearB = (int) substr($b, -7);
        return $yearB - $yearA; // descending, for ascending swap $yearA and $yearB
    })
) {
    // $files is now sorted, do your stuff here
    foreach ((array) $files as $file) {

        if (substr(basename($file, '.html'), -2) == $current_year) {
            echo basename($file, '.html');
            echo "<br />";
        } else {
            $current_year = $current_year - 1;

        }
    }

} else {
    // sorting failed, show error message, exception, etc.
    echo "Files not sorted";
}    
?>