Определяемая пользователем сортировка и фильтрация строкового массива - PullRequest
0 голосов
/ 03 июля 2011

Допустим, у меня есть следующие данные:

$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 ]

1 голос
/ 03 июля 2011

Примечание. Следующая функция будет использовать первое вхождение $ 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
)
0 голосов
/ 03 июля 2011

Примерно так:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...