Как получить только первое найденное значение в массиве - PullRequest
3 голосов
/ 06 марта 2012

Редактировать: я хотел спросить, какой самый лучший / самый быстрый способ получить первое совпадение или первые совпадения хх.

У меня есть массив

$arr = ('abc', 'ded', 'kjld', 'abr', 'cdfd');

Я хочу сначала shuffle этот массив, а затем получить ТОЛЬКО первое значение, соответствующее шаблону /ab/. Таким образом, возвращаемое значение может быть abc или abr.

Я посмотрел на preg_grep, но он вернет массив всех совпадений. Конечно, я мог бы просто получить первое значение результирующего массива, но это расточительно и требует дополнительного шага манипулирования массивом. Есть ли другая функция или переключатель preg_grep, который указывает, возвращает ли только первое сопоставленное значение (или первые 5 сопоставленных значений). Я посмотрел на preg_match и preg_search, но, похоже, они не дают того, что я хочу.

Ответы [ 2 ]

6 голосов
/ 06 марта 2012

Вы можете перебрать свой массив и завершить цикл, когда найдете совпадение, используя break:

foreach($arr as $value) {
    if(preg_match($pattern,$value)) {
        $return_string=$value;
        break;
    }
}

Чтобы указать ограничение:

$limit=3;
$i=0 // sets the number of returned results to 0
$results=array();
foreach($arr as $value) {
    if(preg_match($pattern,$value)) {
        // add the result into the array and increment the counter
        array_push($results,$value);
        $i++;
    } if ($i=$limit) break;
}

Затем вы можете использоватьдругой цикл foreach для возврата ваших значений, таких как:

if(count($results)>0)
foreach ($results as $result) {
    echo $result;
} else echo "No results found";
3 голосов
/ 06 марта 2012

Что ж, я считаю, что выполнение preg_grep и получение первого значения было бы хорошо, но в качестве альтернативы вы можете зациклить свой массив и вернуть, когда совпадение будет найдено следующим образом:

function firstMatch($arr,$pattern) {
    foreach($arr as $item) {
        if(preg_match($pattern,$item)) {
            return $item;
        }
    }
    return 'no match';
}
...