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

时间:2014-10-30 10:35:17

标签: php arrays

我有两个不同长度的数组:

$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");

我希望使用第二个对第一个进行排序,以便输出为数组

$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")

假设我要使用

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

检查$ order_table的字符串是否包含在任何$ paths_table中。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

以下一段代码当然可以通过多种方式进行优化,但为了清楚起见,我没有。

$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;
        }
    }
}

我做了一些假设:

  1. 您想对order_table
  2. 中给出的前缀进行排序
  3. 未给出的前缀放在后面无序。
  4. 您可以更改代码以匹配字符串包含而不是前缀

答案 1 :(得分:0)

预处理数组,以便每个项目都包含其前缀的索引(即将'TS-0007_a.jpg'转换为[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($paths_table);

并删除索引:

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