【问题标题】:Add unique random value from array从数组中添加唯一的随机值
【发布时间】:2019-01-08 17:24:13
【问题描述】:

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

我已经设法根据元字段生成随机值,但我不确定如何使这个唯一并确保不再生成相同的值。我创建了一个空数组$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 );
}

【问题讨论】:

  • 你能把历史保存在for-loop范围内吗?我的意思是 - 您希望它对于每个 i 或更大范围都是唯一的吗?
  • 嗨,大卫,我希望它对于每个 i 和更大的范围都是独一无二的。因此,当新客户购买相同的产品时,他们将无法拥有已经分配给不同客户的号码。对于个人购买,它们还需要是唯一的,因此如果它们有 10 件商品,它将生成 10 个唯一编号。这有意义吗?
  • 我想我明白了 - 我的帖子回答了你的问题吗?
  • 嗨大卫,我还不能测试它,但看起来它会工作。非常感谢

标签: php arrays random woocommerce


【解决方案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。

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

【讨论】:

  • 问个简单的问题 - metadeta_exists 比 empty 或 isset 有什么好处?
  • 我在元数据方法方面没有丰富的经验,但检查存在然后使用 get_post_meta 并检查是否为空似乎是个好习惯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2011-09-22
  • 2013-11-20
  • 2018-02-10
  • 1970-01-01
相关资源
最近更新 更多