Добавить уникальное случайное значение из массива - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь сгенерировать уникальное случайное значение из массива и сохранить его в другом массиве, чтобы его нельзя было использовать снова.

Мне удалось сгенерировать случайное значение на основе мета-поля, но я не уверен, как бы я сделал это уникальным, и чтобы те же значения не генерировались снова. Я создал пустой массив $tickethistory для сохранения значений. Возможно ли при следующем запуске запустить проверку проверки, чтобы $lottery_max_tickets не включало значения $tickethistory?

Я использую функцию ниже, которая возвращает число и I ', вызывая его, когда клиенты покупают продукт в Woocommerce.

function add_lottery_ticket_number( $postid ) {
    $tickethistory = array();
    $lottery_max_tickets = get_post_meta( $postid, '_max_tickets', true );
    $max_tickets = range(1, $lottery_max_tickets);

    $ticketallocated = array_rand($max_tickets, 1);
    $tickethistory[] = $ticketallocated;

    return $ticketallocated;
}


for ( $i = 0; $i < $item_meta['_qty'][0]; $i++ ) {
    add_post_meta( $product_id, '_participant_id', $order->get_user_id() );
    $participants = get_post_meta( $product_id, '_lottery_participants_count', true ) ? get_post_meta( $product_id, '_lottery_participants_count', true ) : 0;
    update_post_meta( $product_id, '_lottery_participants_count', intval( $participants ) + 1 );
    $this->add_lottery_to_user_metafield( $product_id, $order->get_user_id() );
    $ticketnumber = $this->add_lottery_ticket_number($product_id);
    $log_ids[] = $this->log_participant( $product_id, $order->get_user_id(), $ticketnumber, $order_id, $item );
}

1 Ответ

0 голосов
/ 08 января 2019

Как вы можете видеть здесь , вы можете использовать массив хранения в метаданных - в вашем случае, массив tickethistory.

Но для вашего случая я бы выбрал другой подход - создать параметры заявки один раз и каждый раз назначать первый элемент.

Рассмотрим следующее:

function add_lottery_ticket_number( $postId ) {
    if (metadata_exists('post', $postId, 'optionsToGive')) {
        $ticketOptions = get_post_meta( $postId, 'optionsToGive', true );
    } else {
        $lottery_max_tickets = get_post_meta( $postid, '_max_tickets', true );
        $ticketOptions = range(1, $lottery_max_tickets);
        shuffle($ticketOptions ); //random order of all number
    }
    $ticketAllocated = array_shift($ticketOptions); //take the first element
    update_post_meta( $postId, 'optionsToGive', $ticketOptions ); //update all the rest
    return $ticketAllocated;
}

Обратите внимание, если все номера были назначены, это вернет ноль.

Поскольку я никогда не проверял этот код, пожалуйста, рассмотрите его как псевдо.

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