php 按每个字符串中间的数字子串对平面数组排序

im9ewurl  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(121)

我想对一个字符串数组进行排序,其中我想用作排序标识符的子字符串位于所讨论的字符串的中间。我已经尝试过使用一种非常粗糙的技术来做到这一点,我想知道是否有更好的方法来做到这一点。
以下是我到目前为止的想法:

<?php
$tracks = array(
"Arcane Library_Track2.mp3",
"Deeper Ocean_Track4.mp3"
"Neon Illumination_Track3.mp3",
"Sound Of Cars_Track1.mp3",
);

$tracksreversed = array();
$sortedtracks = array();

foreach( $tracks as $t) {
    array_push( $tracksreversed, strrev($t) ); 
}

sort($tracksreversed);

foreach( $tracksreversed as $t ) {
    array_push( $sortedtracks, strrev($t) );
}

$tracks = $sortedtracks;
?>

这种方法是可行的,但有两个问题。首先,它使用了两个循环,第二个问题是,一旦我们包含更多的文件类型,如oggwav,这个方法就会失败。
有没有一种方法可以轻松地根据_Track1_Track2_Track3标识符对这个字符串进行排序?也许这里可以做一些正则表达式排序,或者我可以做一些其他的方法,使它更紧凑?

7gcisfzg

7gcisfzg1#

也许usort函数会有用。比如:

$getIdx = function(string $name) {
   preg_match('/_Track(?<idx>\d+)/', $name, $matches);
   return $matches['idx'];
};

usort($tracks, function ($a, $b) use ($getIdx) {
   return $getIdx($a) <=> $getIdx($b);
});

似乎工作https://3v4l.org/j65rd

nvbavucw

nvbavucw2#

修改我对this similar answer的建议,隔离尾随_Track的数字,并使用array_multisort()进行排序,而不修改原始值或声明额外的变量。
代码:(Demo

array_multisort(
    preg_replace('/.*_Track(\d+)\..*/', '$1', $tracks),
    SORT_NATURAL,
    $tracks
);
var_export($tracks);

相关问题