Как получить случайный результат из preg_match_all? - PullRequest
1 голос
/ 25 января 2010

(Извините, если название довольно бесполезно)

У меня есть эта функция, чтобы получить первое изображение из случайного поста в WordPress. Это прекрасно работает, но теперь мне нужно выбрать случайное изображение из всех совпадений, а не первое. (Я запускаю эту функцию в цикле query_posts для выбора категорий)

// Get first image in post
function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];

    //no image found display default image instead
    if(empty($first_img)){
        $first_img = "/images/default.jpg";
    }

    // Or, show first image.
    return $first_img;
}

Итак, есть ли идеи, ссылки, советы и рекомендации по выбору случайного результата из результатов матчей?

Ответы [ 3 ]

0 голосов
/ 25 января 2010

Попробуйте с этим

// Get first image in post
function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);

    //no image found display default image instead
    if(!$output){
        $first_img = "/images/default.jpg";
    } //or get a random image
    else $first_img=$matches[1][array_rand($matches[1])];

    return $first_img;
}
0 голосов
/ 25 января 2010

Вы можете использовать array_rand() для возврата случайного ключа из массива $matches. Возможно, вам придется изменить формат массива, который вы получаете от preg_match_all().

Вы можете использовать PREG_PATTERN_ORDER, затем передать $matches[$x] в array_rand() - где $x - это группа совпадений, которую вы хотите (0 - полное совпадение, 1 - первая подгруппа). В этом случае array_rand() вернет ключ, и вы можете получить доступ к случайным данным, используя $matches[$x][$rand_key].

В качестве альтернативы, используя PREG_SET_ORDER, вы передадите $matches в array_rand(), а затем используйте возвращенный ключ для доступа к любой подгруппе совпадения. $matches[$rand_key][$x]

Обратите внимание, что вы не получаете случайное значение , вы получаете ключ массива для случайного значения. И, как отмечают другие, вы можете просто использовать функцию array_rand() непосредственно при доступе к массиву, что является простым решением для вырезания / вставки. Однако я надеюсь, что это более длинное объяснение проливает свет на то, что делает код.

0 голосов
/ 25 января 2010

Совпадение всего, а затем используйте array_rand () , чтобы получить случайное совпадение.

Предполагается, что вы используете флаг PREG_SET_ORDER с preg_match_all, чтобы получить случайную ссылку.

$randomImage = $matches[array_rand($matches)][0];

Важно отметить, что array_rand() возвращает случайный ключ, а не случайное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...