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

问题描述 投票:0回答:2

我想对字符串数组进行排序,其中我想用作排序标识符的子字符串位于相关字符串的中间。我已经尝试使用一种非常粗糙的技术来做到这一点,我想知道是否有更好的方法来做到这一点。

这是我到目前为止所想到的:

<?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;
?>

这个方法可行,但有两个问题。首先,它使用两个循环,第二个问题是,一旦我们包含更多文件类型(例如

ogg
wav
),此方法就会失败。

有没有一种方法可以根据

_Track1
_Track2
_Track3
标识符轻松排序该字符串?也许可以在这里完成一些正则表达式排序,或者我可以采取其他一些方法来使其更加紧凑?

php arrays sorting substring
2个回答
1
投票

也许

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


0
投票

修改我对这个类似答案的建议,以隔离尾随

_Track
的数字并使用
array_multisort()
进行排序,而无需修改原始值或声明其他变量。

代码:(演示

array_multisort(
    preg_replace('/.*_Track(\d+)\..*/', '$1', $tracks),
    SORT_NATURAL,
    $tracks
);
var_export($tracks);
© www.soinside.com 2019 - 2024. All rights reserved.