PHP:根据另一个不同长度的数组对数组进行排序

I have two arrays of different length:

$paths_table = array("TS-0007_a.jpg", "TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0041_a.JPG", "TS-0041_b.JPG");

$order_table = array("TS-0040","TS-0007","TS-0041");

and I want to sort the first one using the second so that the output will be the array

$final_table = array("TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0007_a.jpg", TS-0041_a.JPG", "TS-0041_b.JPG")

Assuming that I'm going to use

strpos($paths_table[$i], $order_table[$j]);

to check if the string of $order_table is included in any of the $paths_table.

How can I accomplish this?

Preprocess the array so that each item contains an index of its prefix (that is, turn 'TS-0007_a.jpg' into [1,'TS-0007_a.jpg']):

foreach($paths_table as &$v) {
    foreach($order_table as $n => $o)
        if(strpos($v, $o) === 0) {
            $v = [$n, $v];
            break;
        }
}

sort the array:

sort($paths_table);

and remove indexes:

foreach($paths_table as &$v)
    $v = $v[1];

The following piece of code can off course be optimized in several ways, but for the sake of clarity I didnt.

$paths_table = array("TS-0007_a.jpg", "TS-0040_a.JPG", "TS-0040_b.JPG", "TS-0040_f.JPG", "TS-0041_a.JPG", "TS-0041_b.JPG");
$order_table = array("TS-0040","TS-0007","TS-0041");

$sorter = new PrefixSorter($order_table);
$output = usort($paths_table, array($sorter, 'sort'));

var_dump($paths_table);

class PrefixSorter {
    private $prefixes;

    function __construct($prefixes) {
        $this->prefixes = $prefixes;
    }

    function sort($path1, $path2) {
        $prefix1 = -1;
        $prefix2 = -1;
        foreach($this->prefixes as $index=>$prefix) {
            if (substr($path1, 0, strlen($prefix)) == $prefix) $prefix1 = $index;
            if (substr($path2, 0, strlen($prefix)) == $prefix) $prefix2 = $index;
        }

        if (($prefix1 == -1 && $prefix2 == -1) || $prefix1 == $prefix2) {
            return 0;
        }
        else if ($prefix1 == -1 || $prefix1 > $prefix2) {
            return 1;
        }
        else if ($prefix2 == -1 || $prefix1 < $prefix2) {
            return -1;
        }
    }
}

I made a few assumptions:

  1. You want to sort on the prefixes given in order_table
  2. Prefixes not given are put at the back unordered.

You can off course change the code to match on string containment instead of prefixing