我正在尝试从一个数组生成唯一的随机值,并将其存储在另一个数组中,这样就不能再次使用它。
我已经设法根据元字段生成随机值,但是我不确定如何使它唯一并确保不再生成相同的值。我创建了一个空数组$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 );
}
答案 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。
由于我从未测试过此代码,请考虑将其视为伪代码。