从数组添加唯一的随机值

时间:2019-01-08 17:24:13

标签: php arrays random woocommerce

我正在尝试从一个数组生成唯一的随机值,并将其存储在另一个数组中,这样就不能再次使用它。

我已经设法根据元字段生成随机值,但是我不确定如何使它唯一并确保不再生成相同的值。我创建了一个空数组$tickethistory,将值保存到其中。下次运行验证检查是否可能使$lottery_max_tickets不包含$tickethistory值吗?

我正在使用下面的函数,该函数返回数字,然后在客户在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 :(得分:1)

您可以看到here,可以在元数据中使用存储数组-在您的情况下为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;
}

注意,如果已分配所有数字,则将返回null。

由于我从未测试过此代码,请考虑将其视为伪代码。