用户定义的字符串数组的排序和过滤

时间:2011-07-03 14:23:48

标签: php arrays sorting

假设我有以下数据:

$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,但它无法接近我想要的任何地方。

提前感谢您的帮助。 :)

2 个答案:

答案 0 :(得分:1)

注意:以下函数将仅使用$ 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
)

答案 1 :(得分:0)

这样的事情:

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