Classificando naturalmente os resultados de um scandir?

Estou tentando classificar uma matriz contendo os resultados de uma function scandir. Tentei usar a function nsort () php, mas não parece estar funcionando como eu preciso para meus diretórios.

O conteúdo do diretório digitalizado assume uma convenção de nomeação HH(Z)DDMonYYYY . Depois de usar a function natsort na matriz, o resultado é o seguinte:

 $dates = ["21Z23Oct2017", "20Z23Oct2017", "19Z23Oct2017", "19Z18Oct2017", "19Z17Oct2017", "19Z16Oct2017", "18Z23Oct2017", "18Z18Oct2017", "17Z23Oct2017", ...] 

Como você pode ver, a function é avaliar os dois primeiros dígitos e usá-los para ordenar, mas ignora os dias (23, 18, 17, 16) em cada nome.

Gostaria que a matriz resultante pareça assim:

 $dates = ["21Z23Oct2017", "20Z23Oct2017", "19Z23Oct2017", "18Z23Oct2017", "17Z23Oct2017", ..., "19Z18Oct2017", "18Z18Oct2017", "19Z17Oct2017", "19Z16Oct2017"] 

Uma vez que os diretórios são criados sequencialmente, percebo que eu poderia classificar por criação de diretório ou tempo de modificação e estar bem 99% do tempo. No entanto, em ocasiões raras, os tempos de modificação dos diretórios não estarão em perfeita ordem e eu gostaria de evitar problemas quando esse for o caso.

Existe uma maneira de atingir meu objective na php sem ter que usar os tempos de modificação ou criação?

Graças a todos com antecedência!

EDIT : para contexto, estou usando um script Python para escrever e executar uma operação simples em cada um desses diretórios. O Python inclui um pacote chamado “natsorted” para aqueles que desconhecem, que classifica os diretórios na matriz de exemplo acima sem qualquer problema. Apenas me perguntando se havia uma solução php simples também antes de começar a adicionar complexidade.

Tudo o que natsort() faz é tentar abordar a triagem de strings com seqüências de dígitos de comprimento arbitrário, ele não interpreta magicamente os formatos de data bizarro. Mesmo as funções de PHP que tentam descobrir datas não seriam capazes de descobrir isso, pois eles realmente apenas usam uma lista predefinida de formatos comuns e, mesmo assim, são problemáticos.

IMHO, você sempre deve usar algo como DateTime::createFromFormat() e uma string de formato explícito.

  DateTime::createFromFormat("H\ZdMY",$b); } ); echo json_encode($dates, JSON_PRETTY_PRINT); 

Saída:

 [ "19Z16Oct2017", "19Z17Oct2017", "18Z18Oct2017", "19Z18Oct2017", "17Z23Oct2017", "18Z23Oct2017", "19Z23Oct2017", "20Z23Oct2017", "21Z23Oct2017" ] 

Isso funcionará adequadamente para pequenos conjuntos de datas e / ou quando chamado com pouca frequência. No entanto, se você estiver ordenando um grande número de datas, ou classificando-as com freqüência, você vai querer pré-criar os objects DateTime de antemão. Por enquanto, DateTimes na comparação são recriados para cada comparação .

Avançando, você sempre deve formatar as datas de forma legível e editável , por exemplo: YYYY-MM-DD hh:mm:ss , idealmente ISO8601 .