字符串数组的用户定义排序和筛选


User defined sort and filtering of a string array

假设我有以下数据:

$data = array('av','ds','tg','ik','pk','np','rq');

我很难找到用什么工具来获取两个变量之间的字符串范围。

function sortrange ( $a, $b, $data )
{
    return $range;
}

例如:

sortrange('ds','np', $data);

将返回

array('ds','tg','ik','pk','np');

我还希望它能够进行反向排序,例如:

sortrange('np','tg');

将返回:

array('np','pk','ik','tg');

我发现最接近可用的功能是usort,但它无法接近我想要的。

感谢您提前提供的帮助。:(

注意:以下函数将只使用$start和$end的第一个出现。如果他们重复,行为可能不是你所期望的。

function subset_range($array, $start, $end) {
    $start_index = array_search($start, $array);
    $end_index = array_search($end, $array);
    $min = min($start_index, $end_index);
    $max = max($start_index, $end_index);
    $ret = array_slice($array, $min, $max - $min + 1);
    return $start_index < $end_index ? $ret : array_reverse($ret);
}
$data = array('av','ds','tg','ik','pk','np','rq');
print_r(subset_range($data, 'ds', 'np'));
print_r(subset_range($data, 'np', 'tg'));

输出:

Array
(
    [0] => ds
    [1] => tg
    [2] => ik
    [3] => pk
    [4] => np
)
Array
(
    [0] => np
    [1] => pk
    [2] => ik
    [3] => tg
)

类似这样的东西:

function get_subset($a, $b, $data) {
    // fail if $a or $b is not present in $data
    if(in_array($a) === false || in_array($b) === false) {
        return false;
    }
    // get the index of both $a and $b
    $i_a = array_search($a, $data);
    $i_a = array_search($b, $data);
    $result = array();
    if($i_a < $i_b) {
        // if $a is earlier than $b in $data, loop forward
        for($i = $i_a; $i <= $i_b; $i++) {
            $result[] = $data[$i];
        }
    } elseif($i_a > $i_b) {
        // if $a is later than $b in $data, loop backward
       for($i = $i_a; $i <= $i_b; $i--) {
            $result[] = $data[$i];
        }
    } else {
        // if $a and $b are the same
        return array($a, $b);
    }
    return $result;
}