[英]Get array element with sub elements without repeating in PHP
我有些猶豫,在這里走來走去,我已經傳遞了一個帶有子元素的數組(可以這么說),我需要三個隨機值,但是這些都是隨機獲得的。
數組如下:
Array ( [0] => Array ( [uid] => 1 [ticket_code] => 0oreb8yo ) [1] => Array ( [uid] => 1 [ticket_code] => 2oeii8hm ) [2] => Array ( [uid] => 1 [ticket_code] => m0dwtjiw ) [3] => Array ( [uid] => 1 [ticket_code] => q6c7cymb ) [4] => Array ( [uid] => 1 [ticket_code] => zyqhm5bj ) [5] => Array ( [uid] => 1 [ticket_code] => amdqzjpi ) [6] => Array ( [uid] => 2 [ticket_code] => tzql7l42 ) [7] => Array ( [uid] => 2 [ticket_code] => gap0r6vf ) [8] => Array ( [uid] => 2 [ticket_code] => ypqum5yz ) [9] => Array ( [uid] => 4 [ticket_code] => smupluac ) [10] => Array ( [uid] => 4 [ticket_code] => 9d8jsha7 ) [11] => Array ( [uid] => 5 [ticket_code] => 6hdnja42 ) )
我需要您獲得3個“ ticket_code”,但無權重復“ uid”。
我一直在嘗試如下,但也重復了“ uid”。
$ticketsWinners = array();
for ($i=0; $i < 3; $i++) {
$aux = array_rand($allTickets);
$aux2 = $allTickets[$aux]['uid'];
$ticketsWinners[] = array(
'uid' => $aux2,
'ticket_code' => $allTickets[$aux]['ticket_code']
);
}
有沒有辦法重復做?
如果有人知道我們會先謝謝您^^
嘗試類似:
$ticketsWinners = array();
while (sizeof($ticketsWinners) < 3) {
$aux = array_rand($allTickets);
// array_rand return array of keys so you need first value only
$uid = $allTickets[$aux[0]]['uid']
// add uid as a key so ass not tot check all $allTickets values
if (!isset($ticketsWinners[$uid]))
$ticketsWinners[$uid] = $allTickets[$aux[0]];
}
// if you need $allTickets back to numeric keys [0, 1, 2]
$allTickets = array_values($allTickets);
如果您擔心無限循環(可能確實發生),請嘗試以下操作:
$ticketsWinners = array();
// shuffle array before checking
shuffle($allTickets);
foreach ($allTickets as $tick_data) {
$uid = $tick_data['uid'];
if (!isset($ticketsWinners[$uid]))
$ticketsWinners[$uid] = $tick_data;
if (sizeof($ticketsWinners) == 3)
break;
}
在最壞的情況下,您檢查$allTickets
數組並獲得大小為<= 3
獲勝者。
嘗試這個:
$ticketsWinners = array();
$ticketUid = array();
for ($i=0; $i < 3; $i++) {
$aux = array_rand($allTickets);
$aux2 = $allTickets[$aux]['uid'];
if(! in_array($aux2, $ticketUid)) {
$ticketUid[$i] = $aux2;
$ticketsWinners[] = array(
'uid' => $aux2,
'ticket_code' => $allTickets[$aux]['ticket_code']
);
} else {
$i--;
}
}
這種結構會更好(機票號碼唯一的額外好處)
$tickets = Array
(
'0oreb8yo' => 1,
'2oeii8hm' => 1,
'm0dwtjiw' => 1,
'q6c7cymb' => 1,
'zyqhm5bj' => 1,
'amdqzjpi' => 1,
'tzql7l42' => 2,
'gap0r6vf' => 2,
'ypqum5yz' => 2,
'smupluac' => 3,
'9d8jsha7' => 4,
'6hdnja42' => 5,
);
$winners = array();
$picks = 3;
for($i = 0; $i < $picks; $i++){
if(count($tickets) == 0 ){
break; //or error -- shouldn't need this unless picks exceed uids
}
$ticket = array_rand($tickets);
$winner = $tickets[$ticket];
$winners[] = $winner;
$tickets = array_filter($tickets, function($item) use ($winner){
return $winner != $item;
});
}
echo '<pre>';
var_export($winners);
輸出
array (
0 => 2,
1 => 1,
2 => 4,
)
array (
0 => 2,
1 => 1,
2 => 3,
)
array (
0 => 1,
1 => 3,
2 => 2,
)
與while選項不同,這將通過減少uid的票證數組來減少for循環的每個循環操作。 這也是確保您不總是抽出用戶票證的唯一方法,如果用戶1購買了90%的票證,您將有90%的時間向他循環,無論如何,您都必須減少票證陣列如果獲勝者只能贏一次,則由獲勝者決定。 本質上,當每個uid贏時,您將從列表中刪除它們。 您還可以確保每張彩票都有相同的中獎機會(以及array_rand是隨機的)-它們都有平等的立足點。
loop1之后的票證數組減少
array (
'tzql7l42' => 2,
'gap0r6vf' => 2,
'ypqum5yz' => 2,
'smupluac' => 3,
'9d8jsha7' => 4,
'6hdnja42' => 5,
)
在loop2之后
array (
'smupluac' => 3,
'9d8jsha7' => 4,
'6hdnja42' => 5,
)
在loop3之后
array (
'smupluac' => 3,
'6hdnja42' => 5,
)
獲獎者
array (
0 => 1,
1 => 2,
2 => 4,
)
返回uid和中票變更
$winners[] = $winner;
至
$winners[$ticket] = $tickets[$ticket];
現在贏家將會像輸入數組一樣
ticketnumber => uid
票證是鍵(即票證),獲勝者是值(即uid)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.