我有2个数组合并为一个。一个数组包含一些产品,另一个数组包含数字(产品数量)。
$brick = "RT542,RT543,RT538";
$ratio = "10,15,13";
$bricks = explode(",", $brick);
$ratios = explode(",", $ratio);
$bricks_and_ratio = array_combine($bricks, $ratios);
Array (
[0] => RT542
[1] => RT543
[2] => RT538
)
Array (
[0] => 10
[1] => 15
[2] => 13
)
array_combine()然后给我这个:
Array (
[RT542] => 10
[RT543] => 15
[RT538] => 13
)
到目前为止一切顺利。我想要的是以这样的方式对这个数组进行洗牌,以便我先得到一个2 x RT542,然后是1 x RT538然后是3x RT543,依此类推,依此类推,最多可达到最大项数。
我正在使用它:
function BuildCustomBricks($myBricksAndRatios) {
$img = imagecreate(890,502);
imagealphablending($img, true);
imagesavealpha($img, true);
$keys = array_keys($myBricksAndRatios);
shuffle($keys);
$random = array();
foreach ($keys as $key) {
$random[$key] = $myBricksAndRatios[$key];
for($i = 1; $i <= $myBricksAndRatios[$key]; $i++) {
$cur = imagecreatefrompng("/var/www/brickmixer/bricks/". $key."-$i.png");
imagealphablending($cur, true);
imagesavealpha($cur, true);
imagecopy($img, $cur, -150+$i*132, 0, 0, 0, 125, 32);
}
imagedestroy($cur);
}
header('Content-Type: image/png');
imagepng($img);
}
它会随机播放,但它会创建一系列相同产品的图像,而不是随机顺序。 我需要为每个产品密钥保留最大数量的产品。
解决方案:
function shuffle_bricks($array) {
foreach($array as $key => $value) {
for($i = 1; $i <= $value; $i++) {
$new_array[] = $key;
}
}
shuffle($new_array);
return $new_array;
}
答案 0 :(得分:1)
没有测试过这个,但它应该让你走上正轨:
<?php
function shufflebricks($bricks) {
$rs = array();
while (count($bricks) >= 0) {
$key = array_rand($bricks, 1);
$bricks[$key]--; // Use one brick
$rs[] = $key; // Add it to output
if ($bricks[$key] <= 0) unset($bricks[$key]); // Remove if there's no more of this brick
}
return $rs;
}
?>
一次使用一块砖,剩下砖块的随机砖类型。如果您想一次使用一个块,请在其中添加$quantity = rand(1, $bricks[$key]);
。
答案 1 :(得分:0)
如果使用索引数组,请确保规范化索引:
function shuffleArray($source) {
$target = array();
for($i = count($source); $i > 0; $i--) {
$key = rand(0, $i - 1);
$target[] = $source[$key];
unset($source[$key]);
$source = array_values($source);
}
return $target;
}
通过array_values
功能发生。