Перебор элементов массива без циклов

29.04.19

Примеры очень абстрактные, так как циклы существуют. Необходимо выбрать все элементы массива по заданному признаку. Есть несколько вариантов решения.

Наиболее правильным вариантом в PHP будет использование встроенной функции array_filter(). Но представим, что и ее тоже нет. Напишем свою используя рекурсию.

На PHP функция будет выглядеть так:

function getArrayElements($arr, $pattern) {
    static $i = 0;
    static $arrayResult = array();
    if (preg_match($pattern, $arr[$i])) {
        $arrayResult[] = $arr[$i];
    }
    $i++;
    if (count($arr) == $i) {
        return;
    } else {
        getArrayElements($arr, $pattern);
    }
    return $arrayResult;
}

Пример:

$arr = array('a', 'xd', 'w', 1, 'y', 'x');
$pattern = '/^x/';
print_r(getArrayElements($arr, $pattern)); // Array ( [0] => xd [1] => x )

Теперь разберем тоже самое, но уже на JavaScript. В JS у массива есть аналогичный метод filter(). Но попробуем обойтись без него, воспользуемся рекурсией

var i = 0,
    arrayResult = [];
 
function getArrayElements(arr, pattern) {
    if (pattern.test(arr[i])) {
        arrayResult.push(arr[i]);
    }
    i++;
    if (arr.length == i) {
        return;
    } else {
        getArrayElements(arr, pattern);
    }
    return arrayResult;
}

Пример:

var arr = ['a', 'xd', 'w', 1, 'y', 'x'],
    pattern = /^x/;
console.log(getArrayElements(arr, pattern)); //["xd", "x"]
blog comments powered by Disqus