【问题标题】:Get values from in_array statement从 in_array 语句中获取值
【发布时间】:2016-02-17 22:57:05
【问题描述】:

我有一个填充了查询结果的数组,如下所示:

$ticket[] = array( 
    'ticket_id' => $row->ticket_id,
    'user_id' => $row->user_id,
    'raffle_ticket_num' => $row->raffle_ticket_num
);

现在,在一个 while 循环中,如果我的变量 $number 等于“raffle_ticket_num”,我将检查 $tickets 中的所有数组。我使用以下代码(来自@Fuzzy Tree)执行此操作:

$ticket_num=1;

while ($ticket_num <= $total_slots){

    foreach($ticket as $test) {
        if($test['raffle_ticket_num'] == $ticket_num) { 
             echo $ticket_num.' claimed by '.$test['user_id'];
          }

        else{
             echo $ticket_num;
            }   

    }

$ticket_num++;
}

我现在遇到的问题是,因为我使用的是 foreach 循环,如果找到多个结果,它会导致它回显每个结果,就像 $ticket[].. . 所以有 2 行它会回显所有内容 2 次(因为 foreach)。有谁知道这个的解决方案或替代方案?

您可以在这里看到它:http://tinyurl.com/hxbhx7y。粗体数字是插槽 21 和 38,它们被占用并显示 user_id (1)。但正如你所见,它显示每个数字 2 次(因为 foreach 有 2 个结果)

编辑:使用@Fuzzy Tree 的答案更新帖子

【问题讨论】:

  • 只需使用foreach,如下所示,就足够了
  • 你能给出小的数据样本,你期望得到什么和错误的结果?
  • 是的。在这里查看:tinyurl.com/hxbhx7y。粗体数字是插槽 21 和 38,它们被占用并显示 user_id (1)。但正如您所见,它显示每个数字 2 次(因为 foreach 有 2 个结果)
  • 2个用户可以拥有同一个票号吗?
  • 假设答案是否定的,并用解决方案更新了我的答案。

标签: php mysql arrays


【解决方案1】:

版本 1 foreach 见@FuzzyTree 的回答

第 2 版 array_filter

$number = 1;
$winners = array_filter($tickets, function ($ticket) use ($number) {
    return $ticket['raffle_ticket_num'] == $number;
});

// $winners now has all winning tickets.
var_dump($winners);

// Bonus pick a random winner
shuffle($winners);                                                          
var_dump(current($winners));

所以最好和最简单的方法是在抽奖循环之外准备您的门票数组。 解决方案

<?php

$tickets[] = array(
    'ticket_id' => 1,
    'user_id' => 2,
    'raffle_ticket_num' => 15
);

$tickets[] = array(
    'ticket_id' => 2,
    'user_id' => 2,
    'raffle_ticket_num' => 25
);

$tickets[] = array(
    'ticket_id' => 3,
    'user_id' => 1,
    'raffle_ticket_num' => 21
);

$raffles = range(1, 50);

// Preparing tickets array. Now when I think Flattened is not the best word to describe it :)
$ticketsFlattened = array();
foreach ($tickets as $ticket) {
    $ticketsFlattened[$ticket['raffle_ticket_num']] = $ticket;
}

// Could be while if you want
foreach ($raffles as $number) {
    if (array_key_exists($number, $ticketsFlattened)) {
        echo sprintf(
            "Ticket %s is clamed by %s, ticket id %s %s",
            $number,
            $ticketsFlattened[$number]['user_id'],
            $ticketsFlattened[$number]['ticket_id'],
            PHP_EOL
        );

    } else {
        echo sprintf("Ticket %s unclaimed %s", $number, PHP_EOL);
    }
}

【讨论】:

  • 像魅力一样工作 :) 非常感谢您的帮助!
【解决方案2】:

如果您需要打印匹配的user_idticket_id,然后使用foreach 逐一检查每张票,当您看到带有匹配# 的票时,您可以打印其他详细信息

foreach($tickets as $ticket) {
    if($ticket['raffle_ticket_num'] == $number) {
        print 'In array';
        print $ticket['user_id'];
        print $ticket['ticket_id'];
        //break; //uncomment if you just want one
    }
}

【讨论】:

  • 只是添加foreach($tickets as $key =&gt; $ticket) 如果其他用途需要密钥。
  • 感谢您的回答!但是在我的情况下使用 foreach 的问题在于它在 while 循环中使用,这导致它打印每个结果的数量与查询的总结果一样多......因此,对于 2 个结果,它会打印每个结果 2 次.请参阅上面的更新帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多